Loop que lista pastas com espaços

1

Abordagem

Eu tenho um diretório com pastas nomeadas, aleatoriamente, com espaços em branco e pontos.

Eu criei um pequeno loop ( em um script ) com a intenção de renomear essas pastas. Na base de que estes são meus diretórios ( teste e vazio ):

$ ls -la
./
../
35._JK_io/
'43A. io kl_ -'/
'Mi.Nombre.es Adios'/

Nota: Nós tentamos (creo) que todas as possibilidades de listagem e trabalharam no momento de diferenciar entre diretórios e pastas.

Agora, eu criei um loop para listar apenas os diretórios e ( no futuro ) renomeá-los:

for archives in 'sh -c 'ls -q */' sh'

do

echo  "$archives"
done

Problema

O problema é que quando eu executo o script eu recebo:

35._JK_io/:
43A.
io
kl_
-/:
Mi.Nombre.es
Adios/:

Pergunta

How do I prevent this from happening to me and to appear with spaces and as only three files?

Observação

Ao executar outros scripts nas pastas, ele obteve que 35._JK_io / é um diretório, mas os outros dois não são

Obrigado !!

    
por Nicolás Alarcón Rapela 20.07.2018 / 13:03

1 resposta

5

Ao efetuar o loop pelos diretórios, especialmente quando eles tiverem nomes descolados, não faça um loop pela saída de ls . Em geral, a passagem de nomes de caminho entre os programas precisa ser feita com muito cuidado, pois os nomes de arquivos do Unix podem conter qualquer caractere, exceto / e o caractere nul ( / ).

Em vez disso

for dirname in ./*/; do
    printf 'Directory name is "%s"\n' "$dirname"
done

O% final./*/ no padrão dirname faz com que o padrão seja expandido apenas para diretórios. A variável ./some directory name/ obterá valores como ./ ao fazer isso. Eu incluí - no início do padrão, mas você pode remover isso se quiser. Esteja ciente de que, se você tiver diretórios que tenham um traço ( mv -- "$dirname" "$newname" ) como o primeiro caractere em seus nomes, você terá que usar, por exemplo, -- (com o mv ) para parar ./ de interpretar o traço no nome como uma opção de linha de comando. Com $dirname no início de -- , o %code% não é necessário.

É extra importante para citar expansões de variáveis, já que o shell faria a divisão de palavras e a globalização de nomes de arquivo nos valores.

Relacionados:

por 20.07.2018 / 13:09