Como faço para lidar com diretórios que possuem espaços em seus nomes de 'find'? [duplicado]

1

Eu tenho isso:

#!/bin/bash

for file in 'find . -type d'
do
  echo $file
done

Se eu tiver apenas um diretório chamado My Directory , a saída será

My
Directory

Como corrijo isso?

O echo $file é apenas temporário. Haverá outro código lá operando nos diretórios.

    
por Almo 10.01.2015 / 17:02

6 respostas

4

Algo como os seguintes trabalhos ...

find . -type d | while read dir; do echo $dir; done
.
./my dir

Dependendo do que você está fazendo, é melhor usar a opção find e -print0 .

O código que você tem pega a saída sem aspas de xargs -0 e a usa como uma lista de palavras (divididas em espaço em branco) para find para iterar.

    
por 10.01.2015 / 17:08
2

Não use for loop, use while :

find . -type d -print0 | while read -d '' -r dir; do echo "$dir"; done

A opção print0 imprime o caractere NULL no final do nome do arquivo / diretório (em vez da nova linha) e o read -d '' interpreta-o corretamente.

    
por 10.01.2015 / 17:08
1

Se você realmente estiver olhando apenas para echo dos resultados de find , poderá usar o parâmetro -print (ou simplesmente nenhum parâmetro adicional) para que find imprima uma lista de seus resultados.

Se você quiser excluir os resultados, há -delete (que pode ser combinado com -print para obter uma lista dos arquivos excluídos).

Se você quiser fazer outra coisa com / para os resultados, use o parâmetro -exec para passar os resultados como parâmetros para outro comando, por exemplo,

  • find . -type d -exec tar cf {}.tar {} \; para compactar todos os diretórios em tarballs individuais (um tar por diretório, pois \; torna find executar o comando -exec com um resultado por vez)
  • find . -type d -exec tar cf all-directories.tar {} + para compactar todos os diretórios em um único tarball ( + faz find executar o comando -exec com o maior número de resultados possível de cada vez)
por 10.01.2015 / 17:11
1

Antes de responder à sua resposta, recomendo que você leia duas perguntas:

Para sua pergunta, você não precisa de um for loop, apenas encontre-se:

find -type d

Se você quiser fazer mais coisas, basta usar a opção -exec (ou -execdir se o seu find support):

find -type d -exec ... +
    
por 10.01.2015 / 17:13
0

Você pode usar apenas "$ file" no seu exemplo.

    
por 10.01.2015 / 17:10
0

Você precisa definir a variável IFS no bash:

SAVEIFS=IFS
IFS=$(echo -en "\n\b")
...
YOURCODE
....
IFS=$SAVEIFS

Mas o que o código acima faz? , descarta qualquer espaço e meta char ..

    
por 10.01.2015 / 19:25