Você está usando um antipadrão, pois nunca deve usar um loop for
para iterar a saída de um comando find
. É um pouco parecido com parsing ls
output , que você também nunca deve fazer.
Em vez disso, use a capacidade incorporada de find
para executar comandos:
find /home/rmintz/Documents/ -type f -name "*jpg" -exec echo {} \;
Aqui, o {}
é substituído pelo nome de todos os arquivos ou diretórios encontrados.
Se você quisesse usar um loop (por exemplo, para operações mais complicadas), teria que delimitar cada caminho de arquivo com um caractere NULL, que é a opção -print0
, e usar while
e read
para analisar essa saída:
find /home/rmintz/Documents/ -type f -name "*jpg" -print0 | while IFS= read -r -d '' file; do
echo "$file"
done
Se você não fizer isso, mas preferir analisar a saída de find
, os argumentos para for
serão realmente divididos em cada caractere de espaço em branco. Isso significa que os arquivos com um espaço em seu nome realmente apareceriam como dois arquivos separados para echo
. Além disso, se a sua lista de arquivos fosse muito longa, você excederia o tamanho máximo do argumento para um comando. É nesse ponto que o pipe ajuda no segundo exemplo.
Em seu exemplo específico, não sei por que ele produziria um caminho como /usr/lib
, pois isso só poderia acontecer se você tivesse uma barra real no nome do arquivo, por exemplo, se o seu arquivo foi chamado /usr/lib foo.jpg
.