find não passa por todos os arquivos na estrutura de pastas

0

Eu quero converter um monte enorme de arquivos wmf (120860!) para svg em muitas subpastas (27 subpastas com muitas sub-sub-pastas cada). Eu tenho este script bash que faz

for i in 'find -iname "*.wmf"'; do
  uniconvertor ${i} ${i%.wmf}.svg
done

mas nunca converte tudo, sempre pára em algum lugar no meio. Algumas subpastas são convertidas, outras não, outras apenas parcialmente. Mesmo se eu iniciar o script de shell em todas as 27 subpastas de primeiro nível, somente parte dos arquivos será convertida.

Qual poderia ser o problema?

    
por HinzundKunz 14.02.2016 / 15:57

2 respostas

1

Se você não tiver quebras de linha nos nomes de seus arquivos ou pastas, use um while em vez de um for loop:

find -iname "*.wmf" | while read file; do
    uniconvertor "$file" "${i%.wmf}.svg" 
done

Isso evita problemas com espaços em nomes e com muitos argumentos ao expandir o ...

    
por Florian Diesch 14.02.2016 / 16:50
0

Você deve cercar seu comando find ... com $( ) para substituir a saída, assim:

for i in $( find . -type f -iname '*.wmv' ) ; do ...

No entanto, você está fazendo com que o Bash produza (e armazene internamente) uma lista de 120.860 nomes de arquivos antes de processar o primeiro. Além disso (você não descreveu o formato dos nomes dos arquivos), esta técnica manipula incorretamente nomes de arquivos com espaços neles, por exemplo. %código%.

Leia A Big File.wmf , especialmente, sobre man find , leia --print0 , especialmente sobre man xargs , leia -0 e envolva seu comando em um script que execute man bash em cada um de seus argumentos e use algo como:

find . -type f -iname '*.wmv' -print0 | xargs -0 thescript 

Certifique-se de ler uniconverter e esteja ciente de todos os Espaços nos seus nomes de arquivo.

@steeldriver: TQ para apontar meu erro. Lendo man bash mostra:

 Enclosing characters in double quotes preserves the  literal  value  of
       all  characters  within the quotes, with the exception of $, ', \, and,
       when history expansion is enabled, !.  The characters $  and  '  retain
       their  special meaning within double quotes.  The backslash retains its
       special meaning only when followed by one of the following  characters:
       $,  ',  ", \, or <newline>.  A double quote may be quoted within double
       quotes by preceding it with a backslash.

Portanto, fiquei preocupado com a expansão do Shell.

    
por waltinator 14.02.2016 / 16:36