Como modificar um loop de função de localização para lidar com barras invertidas e espaços em branco? [duplicado]

2

Atualmente, estou tentando analisar todos os arquivos dentro de um diretório. Eu tenho uma função find, mas parece não ser capaz de analisar em diretórios de arquivos com espaços em branco em um loop. Aqui, "$DIR" é o diretório que eu quero pesquisar. Alguém tem alguma idéia de como eu posso modificá-lo para funcionar? obrigado.

for file in $(find "$DIR" -type f)
do
   echo "$file"
done
    
por user321627 08.06.2018 / 19:39

3 respostas

5

Você não precisa for fazer isso.

find "$dir" -type f

irá por padrão mostrar todos os objetos encontrados.

Você pode tornar isso explícito com:

find "$dir" -type f -print

Se você realmente quiser fazer uma iteração, use um separador nulo e xargs :

find "$dir" -type f -print0 | xargs -0 -n1 echo

Ou find : -exec :

find "$dir" -type f -exec echo "{}" \;
    
por 08.06.2018 / 19:41
5

find ... | xargs ... e find ... -exec ... são duas opções melhores do que isso: para usar um loop de shell para iterar os resultados da pesquisa corretamente, devemos usar um while read loop:

while IFS= read -d '' -r filename; do 
    echo "$filename"
done < <(find "$dir" -type f -print0)

Muito para descompactar:

  • usamos uma Substituição de processo para executar o comando de localização e poder para ler os resultados como se fosse um arquivo.
  • Para ler uma linha de entrada na íntegra, o idioma do bash é IFS= read -r line . Isso permite que espaços em branco arbitrários e barras invertidas sejam lidos na variável.
  • read -d '' usa o byte nulo (como produzido por -print0 ) como caractere de fim de linha em vez de nova linha.
por 08.06.2018 / 20:13
4

Você deve não analisar a saída de find pelas mesmas razões pelas quais você não deve analisar ls

Tente usar find / exec :

find "$DIR" -type f -exec echo {} \;
    
por 08.06.2018 / 19:42

Tags