“para arquivo em” numericamente em vez de alfabeticamente? [duplicado]

5

Eu tenho um script que gera um índice baseado em cada arquivo em uma pasta. Todos os nomes de arquivos são um número com extensão.

Como posso modificar meu loop para processá-los em ordem numérica?

for file in xml/*.xml; do
  ...
done
    
por Philip Kirkbride 04.10.2017 / 15:27

4 respostas

8

Se você tiver GNU sort que tem a opção de reduzir o limite no while delimitador que você pode fazer. Dessa forma, o loop printf começará a obter arquivos na ordem classificada para você processar. Substitua a opção nullglob por sua própria lógica personalizada.

shopt -s nullglob

printf '%s
( shopt -s nullglob; printf '%s
shopt -s nullglob

printf '%s
( shopt -s nullglob; printf '%s%pre%' xml/*.xml ) | sort -zV |  while read -rd '' file; do
    printf "%s\n" "$file"
done
' xml/*.xml | sort -zV | while read -rd '' file; do printf "%s\n" "$file" done shopt -u nullglob
' xml/*.xml ) | sort -zV | while read -rd '' file; do printf "%s\n" "$file" done
' xml/*.xml | sort -zV | while read -rd '' file; do printf "%s\n" "$file" done shopt -u nullglob

A opção xml evita que o shell expanda um glob vazio se nenhum arquivo -u for encontrado na pasta atual. A opção %code% não é configurada após o processamento ser concluído.

Como Tony Speight aponta corretamente, se você não quer mexer com as opções de shell (por exemplo, pode ser habilitado por outros motivos) você poderia apenas definir na sub-shell e deixar a expansão glob acontecer

%pre%     
por 04.10.2017 / 15:34
5

Se você puder usar o zsh (para um script, é um compromisso entre o desenvolvimento conveniente e a implantação conveniente):

for file in xml/*.xml(n); do
  ...
done

O qualificador glob n especifica que, ao solicitar as correspondências para o glob padrão, sequências de dígitos devem ser ordenadas de acordo com a ordem numérica do número inteiro que elas representam, e não na ordem lexicográfica, ou seja, foo10bar vem depois de foo9bar .

Você também pode usar setopt numeric_glob_sort para fazer com que todos os padrões glob usem essa configuração .

    
por 04.10.2017 / 16:19
4

Nos moldes das uma das sugestões de Kusalananda :

Prep:

mkdir xml && cd xml
touch 1.xml 10.xml 23.xml 999.xml
cd ..

Loop:

for f in {1..100}; do [ -f "xml/$f.xml" ] && echo process "xml/$f.xml"; done

Resultados em:

process xml/1.xml
process xml/10.xml
process xml/23.xml

Faça o loop de expansão de chave grande o suficiente para cobrir o maior arquivo numérico.

    
por 04.10.2017 / 15:45
-3
ls -Q xml*.xml | while read line;do 
   ...
done

ls listará os arquivos em ordem numérica e -Q assegurará que quaisquer espaços sejam tratados.

    
por 04.10.2017 / 15:36