find e md5sum não produzindo nenhuma saída (find -o limit?)

2

Eu me deparei com uma situação que eu realmente não entendo. Eu tenho um monte de arquivos de backup em uma estrutura recursiva da qual eu quero calcular o md5. Quando adiciono algumas extensões de arquivo adicionais, o processo é encerrado (código de saída 0) sem produzir nenhuma saída.

find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -print0 | xargs -0 md5sum
find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mpg" -print0 | xargs -0 md5sum

O primeiro funciona bem, o segundo não produz saída. Eu até tentei em um diretório onde não há arquivos mpg, mesmo comportamento.

Existe um limite no número de argumentos para encontrar? Estou executando o OSX e instalei o md5sum da Macports.

Informações adicionais

Parece haver algo estranho com o pipe e estou inclinado a culpar os nomes dos arquivos. Investigações posteriores em outra pasta mostram que o comando find parece funcionar e há 129 arquivos de vídeo, dos quais 1 é .mpg. Quando tento o find + md5sum ele retorna após apenas 1 arquivo. Eu corri um comando semelhante em outra pasta que contém apenas imagens e funcionou bem (encontrou 80k arquivos, rendimento 80k hashes).

Pictures@2006$ find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" | wc -l
 128
Pictures@2006$ find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mpg" | wc -l
 129
Pictures@2006$ find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mpg" -print0 | xargs -0 md5sum
 c21a78f2b2d5ca773b47647315ad91f8  ./pending photos/Video [%]/P007.MPG
Pictures@2006$

Também notei que o segundo nome do arquivo para processar continha pontuação, um sinal de mais e caracteres não-ascii. É possível que o erro seja devido à nomenclatura de arquivos? Existe alguma solução alternativa?

/Esplai/+Nou/20060604 Dinar d'últim dia d'esplai[Barbacoa al torrent de l'Escaiola]/MVI_7702.AVI
    
por Josep Valls 11.09.2015 / 18:46

3 respostas

1

Deixe-me mencionar primeiro que -print0 não é padrão e não é a melhor solução. Melhor é usar "execplus", por exemplo,

find dir -type f -exec cmd {} +

Seu principal problema, entretanto, é que os operadores têm precedência e seu -print é "anded" apenas com o último nome primário.

Portanto, o método correto é colocar os primários -o red entre parênteses:

find dir ( -name '*.x1' -o -name '*.x2' ) -exec cmd {} +

Você pode, claro, adicionar mais operadores -o-type, se precisar.

    
por 11.09.2015 / 21:56
4

Se as expressões do operador em um comando find não forem separadas por -o (significando ou ) ou -a ( e ), haverá uma% implícita-a entre eles. E -a liga mais strongmente que -o , então

find . -type f -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" \
     -o -iname "*.mp4" -o -iname "*.mpg" -print0 

será analisado como

find . '(' -type f -a -iname "*.3gp" ')' -o -iname "*.avi" -o -iname "*.mov" \
     -o -iname "*.mp4" -o '(' -iname "*.mpg" -a -print0 ')'

Portanto, o -print0 somente imprimirá arquivos (e diretórios!) correspondentes a *.mpg . É por isso que, com esse comando, você está processando apenas um arquivo, em vez dos 129 arquivos esperados.

Você pode usar parênteses (entre aspas, porque eles também são especiais para o shell) para alterar o agrupamento:

find . -type f '(' -iname "*.3gp" -o -iname "*.avi" -o -iname "*.mov" \
     -o -iname "*.mp4" -o -iname "*.mpg" ')' -print0 | xargs -0 md5sum
    
por 11.09.2015 / 21:41
0

Acho que você tem um arquivo no diretório atual que corresponde ao curinga "*.mpg" e expande para algo que confunde find , por exemplo, %código%. Se você usa aspas simples, por exemplo ... -o iname A Movie about Birds.mpg em vez de aspas duplas '*.mpg' , a expansão de curinga não será concluída e "*.mpg" verá find .

Para ver o que está acontecendo, coloque um *.mpg no início ( echo ) ou canalize o resultado para echo find ...

    
por 11.09.2015 / 19:30