Por que encontrar: s - ou falha quando eu adiciono um -print0 no final?

4

Estou escrevendo um pequeno script que modifica alguns filmes em uma árvore de diretórios, e gostaria de analisar essa árvore com um bash para loop ou similar.

Então eu comecei a encontrar os arquivos com

find -iname *.mov -or -iname *.mkv -or -iname *.avi

e ele me mostra alguns arquivos de cada tipo, como esperado.

Mas, em seguida, tento fazer um loop sobre o resultado com isso (já que há espaço em branco em alguns dos nomes de dir).

find -iname *.mov -or -iname *.mkv -or -iname *.avi -print0 | while read -d $'
find -iname *.mov -or -iname *.mkv -or -iname *.avi
' line do echo $line done

Mas agora ele só retorna os arquivos avi! Então parece que quando eu adiciono o -print0 ele ignora o meu - ou o outro - iname.

O que está acontecendo aqui, o que estou perdendo?

Eu preciso enviar o resultado de find para um arquivo tmp antes de dar um loop sobre o resultado?

    
por Johan 31.12.2011 / 12:30

1 resposta

10

A ação -print0 só se anexa ao último teste ( -iname *.avi neste caso). Repita a ação de impressão para cada partida ou faça algum agrupamento.

find -iname '*.mov' -print0 -or -iname '*.mkv' -print0 -or -iname '*.avi' -print0

ou

find \( -iname '*.mov' -or -iname '*.mkv' -or -iname '*.avi' \) -print0

E cuidado com esses * - da página find man:

Please note that you should quote patterns as a matter of course, otherwise the shell will expand any wildcard characters in them.

Uma forma um pouco mais concisa se o seu find tiver essa opção:

find -iregex '.*\.\(mov\|mkv\|avi\)$' -print0

(E você pode querer adicionar -type f no caso de você se encontrar nomeando diretórios com essas extensões.)

    
por 31.12.2011 / 12:40

Tags