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 forloop:
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 findque se pensa, também são considerados links simbólicos para diretórios e excluídos os ocultos)
findtipo.
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 bashnovato 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 findbrincadeira, talvez até que alguém lhe diga como fazê-la bash!
findcomando externo .
$(find...)coisa é má prática .
Parece que você deseja os nomes de arquivos em cada um dos subdiretórios; o ls -l | awknão é suficiente robusta, para o que se esses nomes incluem espaços em branco e / ou novas linhas? O abaixo findfuncionaria mesmo para finds que não têm a -maxdepthoportunidade 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
lsgrava um arquivo por linha (o que a -1opçã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.