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: