Como evitar que “for” divida nomes de diretórios?

2

Estou tentando listar todos os diretórios ocultos com um loop "for":

for i in ''ls -a | grep '^\.'' ';
do 
    echo $i
done

O problema é que o loop divide alguns nomes de diretórios em dois.

Por exemplo: ls -a | grep '^\.' me dá

.
..
.Deleted Items
.Drafts 
.Junk
.Junk E-mail
.Sent
.Sent Items
.Trash

Mas meu loop me dá:

.
..
.Deleted
Items
.Drafts
.Junk
.Junk
E-mail
.Sent
.Sent
Items
.Trash

Como eu melhoro meu script para que ele não divida nomes de diretório?

    
por B14D3 23.05.2011 / 15:42

4 respostas

10

Você não precisa do comando ls , pois o shell fará a expansão para você e você deve citar " da variável

for i in .*/
do
echo "$i"
done
    
por 23.05.2011 / 16:32
2

A menos que exista uma necessidade específica de 'for', você pode tentar um loop while:

ls -d .* | while read Name  
do  
    echo "$Name"  
done  
    
por 23.05.2011 / 17:29
1

Muitas maneiras de contornar isso, desde encontrar até citações extras, etc.

Pessoalmente, acho útil modificar a variável IFS. O IFS é usado para determinar qual o caractere de quebra entre itens de lista para for e similares. Portanto, defina o IFS como uma nova linha por meio de IFS=$'\n' . Isso fará com que o loop for seja lido até o final de uma linha de entrada, antes de iniciar um novo item em sua lista. Pode não ser a maneira mais fácil de resolver esse problema específico (a resposta de Iain é mais elegante), mas achei bastante útil em várias situações.

    
por 23.05.2011 / 16:28
0

Eu tive um problema semelhante há alguns dias e este tópico foi muito útil. Espero que você encontre inspiração lá.

    
por 23.05.2011 / 15:57