Por que esse comando “find” verifica todos os diretórios?

-1

Eu só quero recursivamente varrer Documents e não deixar essa pasta "pai". Meu script examina recursivamente todo o meu sistema de arquivos, e não tenho certeza de qual elemento desse script está causando isso. Isso é o que eu tenho:

#/bin/sh
for f in $(find /home/rmintz/Documents/ -type f -name "*jpg")
do
  echo $f
done

O que eu preciso alterar para que esse script bash varra apenas a pasta Documents e nada mais?

Tenho a impressão de que isso está examinando todo o meu sistema de arquivos, pois a saída no terminal mostra diretórios fora do domínio de /home/rmintz/Documents .

Um exemplo é /usr/lib .

    
por user2676140 11.05.2016 / 14:42

1 resposta

5

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 .

    
por 11.05.2016 / 15:19