Utilizar a saída de ls
para obter nomes de ficheiros é uma má ideia . Pode levar a um mau funcionamento e até mesmo a scripts perigosos. Isto porque um nome de ficheiro pode conter qualquer caractere excepto /
e o caractere null
, e ls
não usa nenhum desses caracteres como delimitadores, por isso se um nome de ficheiro tem um espaço ou uma nova linha, você _obterá resultados inesperados.
Há duas boas maneiras de iterar sobre ficheiros. Aqui, usei simplesmente echo
para demonstrar que se faz algo com o nome do ficheiro; pode usar qualquer coisa, no entanto.
A primeira é usar as funcionalidades nativas do globbing da shell.
for dir in */; do
echo "$dir"
done
A shell expande */
em argumentos separados que o laço for
lê; mesmo que haja um espaço, uma nova linha, ou qualquer outro carácter estranho no nome do ficheiro, for
verá cada nome completo como uma unidade atómica; não está a analisar a lista de forma alguma.
Se quiser ir recursivamente para subdirectórios, então isto não servirá a não ser que a sua shell tenha algumas características de globbing estendidas (tais como bash
‘s globstar
. Se a sua shell não tiver estas funcionalidades, ou se quiser garantir que o seu script irá funcionar numa variedade de sistemas, então a próxima opção é usar find
.
find . -type d -exec echo '{}' \;
Aqui, o comando find
irá chamar echo
e passar-lhe um argumento do nome do ficheiro. Ele faz isso uma vez para cada arquivo que encontrar. Tal como no exemplo anterior, não há análise de uma lista de nomes de ficheiros; em vez disso, um nome de ficheiro é enviado completamente como argumento.
A sintaxe do argumento -exec
parece um pouco engraçada. find
pega no primeiro argumento depois de -exec
e trata-o como o programa a correr, e em cada argumento subsequente, toma como argumento para passar para esse programa. Existem dois argumentos especiais que o -exec
precisa de ver. O primeiro é o {}
; este argumento é substituído por um nome de ficheiro que as partes anteriores do find
geram. O segundo é o ;
, que permite ao find
saber que este é o fim da lista de argumentos a passar para o programa; find
precisa disto porque pode continuar com mais argumentos que se destinam ao find
e não se destinam ao programa de execução. A razão para o [ Utilizar a saída de
lspara obter nomes de ficheiros é uma má ideia ]&003. Pode levar a um mau funcionamento e até mesmo a scripts perigosos. Isto porque um nome de ficheiro pode conter qualquer caractere excepto
/e o caractere
null, e
ls` não usa nenhum desses caracteres como delimitadores, por isso se um nome de ficheiro tem um espaço ou uma nova linha, você _obterá resultados inesperados.
Há duas boas maneiras de iterar sobre ficheiros. Aqui, usei simplesmente echo
para demonstrar que se faz algo com o nome do ficheiro; pode usar qualquer coisa, no entanto.
A primeira é usar as funcionalidades nativas do globbing da shell.
for dir in */; do
echo "$dir"
done
A shell expande */
em argumentos separados que o laço for
lê; mesmo que haja um espaço, uma nova linha, ou qualquer outro carácter estranho no nome do ficheiro, for
verá cada nome completo como uma unidade atómica; não está a analisar a lista de forma alguma.
Se quiser ir recursivamente para subdirectórios, então isto não servirá a não ser que a sua shell tenha algumas características de globbing estendidas (tais como bash
’s globstar
. Se a sua shell não tiver estas funcionalidades, ou se quiser garantir que o seu script irá funcionar numa variedade de sistemas, então a próxima opção é usar find
.
find . -type d -exec echo '{}' \;
Aqui, o comando find
irá chamar echo
e passar-lhe um argumento do nome do ficheiro. Ele faz isso uma vez para cada arquivo que encontrar. Tal como no exemplo anterior, não há análise de uma lista de nomes de ficheiros; em vez disso, um nome de ficheiro é enviado completamente como argumento.
A sintaxe do argumento -exec
parece um pouco engraçada. find
pega no primeiro argumento depois de -exec
e trata-o como o programa a correr, e em cada argumento subsequente, toma como argumento para passar para esse programa. Existem dois argumentos especiais que o -exec
precisa de ver. O primeiro é o {}
; este argumento é substituído por um nome de ficheiro que as partes anteriores do find
geram. O segundo é o ;
, que permite ao find
saber que este é o fim da lista de argumentos a passar para o programa; find
precisa disto porque pode continuar com mais argumentos que se destinam ao find
e não se destinam ao programa de execução. A razão para o é que a shell também trata o ;
especialmente - representa o fim de um comando, por isso precisamos de escapar a ele para que a shell o dê como argumento ao find
em vez de o consumir por si; outra forma de fazer com que a shell não o trate especialmente é colocá-lo entre aspas: o ';'
funciona tão bem como o \;
para este propósito.