Como lidar com espaços em branco em scripts

2

Eu gostaria de encontrar alguns arquivos no meu disco externo e excluí-los. Eu criei o seguinte script (para testar eu só uso ls $ i para verificar a saída)

for i in 'find /media/My\ Book/ -name "OP_CACHE.IDX" -print'; 
  do ls $i; 
done

O problema é que o comando find retorna apenas strings onde os espaços em branco (por exemplo, "My Book") não são codificados (como eu faço em / media / My \ Book) e, portanto, recebo erros que as pastas não podem ser encontrado.

Como posso resolver esse problema com os espaços em branco? Existe uma bandeira para encontrar ou algo assim?

considera Marc

    
por lostiniceland 13.01.2010 / 16:32

3 respostas

5

um sinalizador para find e é usado assim:

find "/media/My Book" -name "OP_CACHE.IDX" -exec ls {} \;

Isso também pode ser usado:

find "/media/My Book" -name "OP_CACHE.IDX" -print0 | xargs -0 ls

(O argumento -print0 informa find para separar nomes de arquivos por bytes nulos, não por novas linhas. Na maioria dos sistemas de arquivos modernos (ext3 e NTFS por exemplo), nomes de arquivos podem conter não apenas espaços mas também novas linhas, abas, tudo exceto um byte nulo.Embora seja muito improvável que o seu próprio disco tenha esses nomes de arquivos, eu tento ser cuidadoso com isso.

Se você for excluir apenas os arquivos depois, find também poderá fazer isso:

find "/media/My Book" -name "OP_CACHE.IDX" -delete

(Você pode até usar -print -delete para ver cada arquivo enquanto está sendo removido).

Se você precisa usar um loop bash, isso funcionará na maioria das vezes:

find "/media/My Book" -name "OP_CACHE.IDX" | while read file; do
  ls "$file"
done

Mas veja o comentário sobre -print0 acima.

    
por 13.01.2010 / 16:59
1

Você deve enviar seu find para while read :

find ... | while read i
    
por 13.01.2010 / 16:53
0

Em vez de usar for ... , use while read , assim:

find .... | while read LINE ; do
  ls "$LINE"
done

Ele lerá uma linha por vez e a colocará na variável LINE . Assim, não importa se a descoberta não escape dos espaços. Eu também envolvi o comando ls em " , o que impede que um espaço estrague tudo

    
por 26.01.2010 / 14:47

Tags