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)
bash
shell-script
Ashish
fonte
fonte
Respostas:
Use um
for
loop: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 é:Ou simplesmente
bash
:(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)fonte
find
tipo.date +"%m%d20%Y"
| xargs echo echo $ ddate +"%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ávamosfind [-maxdepth <levels>] <start-dir> -exec <command> ;
fazer isso. Você pode fazer umaman find
brincadeira, talvez até que alguém lhe diga como fazê-labash
!fonte
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 abaixofind
funcionaria mesmo parafind
s que não têm a-maxdepth
oportunidade para eles:fonte
Eu tenho a solução. O comando find abaixo atende aos meus requisitos.
fonte
Também é possível usar ls, grep e tr
du / sed também pode ser usado como seletor se o seu ls não possui as opções acima
Pode ser importante observar que esses exemplos retornam diretórios ocultos e excluem os diretórios pai e atual
fonte
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 dels
é 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.