Quero que meu script shell visite todos os subdiretórios em um diretório principal. Faça algo nos diretórios, envie a saída para um arquivo em spool e vá para o próximo diretório. Considere Dir principal = / tmp Sub dir = ABCD (quatro subdiretórios)
Quero que meu script shell visite todos os subdiretórios em um diretório principal. Faça algo nos diretórios, envie a saída para um arquivo em spool e vá para o próximo diretório. Considere Dir principal = / tmp Sub dir = ABCD (quatro subdiretórios)
Respostas:
Use um for
loop:
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
Ele pesquisa apenas os subdiretórios do diretório /path/to/dir
. Observe que o exemplo simples acima falhará se os nomes de diretório contiverem espaços em branco ou caracteres especiais. Uma abordagem mais segura é:
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
Ou simplesmente bash
:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(observe que, ao contrário do find
que se pensa, também são considerados links simbólicos para diretórios e excluídos os ocultos)
find
tipo.
date +"%m%d20%Y"
| xargs echo echo $ d
date +"%m%d20%Y"
| xargs echo echo $ d O resultado esperado é ls -ltr de todos os subdiretórios . O loop acima não está funcionando #
Sou um bash
novato completo , mas um veterano da UN * X. Embora, sem dúvida, isso possa ser feito nos scripts de shell do Bash, nos velhos tempos costumávamos find [-maxdepth <levels>] <start-dir> -exec <command> ;
fazer isso. Você pode fazer uma man find
brincadeira, talvez até que alguém lhe diga como fazê-la bash
!
find
comando externo .
$(find...)
coisa é má prática .
Parece que você deseja os nomes de arquivos em cada um dos subdiretórios; o ls -l | awk
não é suficiente robusta, para o que se esses nomes incluem espaços em branco e / ou novas linhas? O abaixo find
funcionaria mesmo para find
s que não têm a -maxdepth
oportunidade para eles:
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
Também é possível usar ls, grep e tr
for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done
ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done
du / sed também pode ser usado como seletor se o seu ls não possui as opções acima
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
Pode ser importante observar que esses exemplos retornam diretórios ocultos e excluem os diretórios pai e atual
ls
grava um arquivo por linha (o que a -1
opção especifica) por padrão quando a saída padrão é um pipe (portanto, é supérfluo em suas respostas). (2) Analisar a saída de ls
é uma péssima idéia - veja isto e isto . Sua primeira resposta falhará se os diretórios tiverem espaços (ou novas linhas) em seus nomes e tudo falhará se eles tiverem novas linhas em seus nomes. (3) Você deve sempre citar variáveis do shell (por exemplo, "$dir"
) a menos que tenha um bom motivo para não fazê-lo e tenha certeza de que sabe o que está fazendo.