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 delspara 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 caracterenull, els` 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.