Enquanto pesquisava sobre essa questão: Find e mover diretórios com base no tipo de arquivo e na data , me deparei com um problema meu.
Primeiro, criei vários diretórios com arquivos neles:
seq 10 | while read dir; do
mkdir dir$dir
touch dir$dir/file.txt
seq 5 | while read file; do
touch dir$dir/file${dir}_$file
done
done
Então tentei seguir o comando find:
$ find -type f -name "*.txt"
./dir6/file.txt
./dir8/file.txt
./dir10/file.txt
...
Funciona como esperado.
Agora com um -exec :
$ find -type f -name "*.txt" -exec sh -c 'echo mv -v "${0%/*}" ../bar' {} \;
mv -v ./dir6 ../bar
mv -v ./dir8 ../bar
mv -v ./dir10 ../bar
...
Funciona como esperado.
Agora o comando real:
$ find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \;
'./dir6' -> '../bar/dir6'
Ele pára após o primeiro mv . Nenhuma mensagem de erro. O status de saída é 0. O diretório bar existe e dir6 é movido corretamente.
Quando eu executo novamente, isso acontece:
$ find -type f -name "*.txt" -exec sh -c 'mv -v "${0%/*}" ../bar' {} \;
'./dir8' -> '../bar/dir8'
Pare novamente após o primeiro mv . O status de saída é 0. dir8 é movido corretamente.
Por que find é interrompido após o primeiro mv ? Porque o diretório foi movido e find está confuso? Por que não imprime um erro ou retorna um status de saída de erro?
Quando eu crio mais diretórios e mais arquivos, ele tem o mesmo comportamento.
Na questão vinculada acima, o problema é que find é executado uma vez sem problema, mas imprime erros para todas as correspondências depois disso. Isso está relacionado?
Usando find (GNU findutils) 4.4.2 .