Estou escrevendo um script no bash no Linux e preciso passar por todos os nomes de subdiretórios em um determinado diretório. Como posso percorrer esses diretórios (e pular arquivos regulares)?
Por exemplo:
o diretório fornecido /tmp/
possui os seguintes subdiretórios:/tmp/A, /tmp/B, /tmp/C
Eu quero recuperar A, B, C.
Respostas:
Uma breve explicação:
find
encontra arquivos (obviamente).
é o diretório atual, que após ocd
é/tmp
(IMHO é mais flexível do que ter/tmp
diretamente nofind
comando. Você tem apenas um lugar, ocd
, para alterar, se desejar que mais ações ocorram nesta pasta)-maxdepth 1
e-mindepth 1
certifique-se de quefind
apenas olhe no diretório atual e não se inclua.
no resultado-type d
procura apenas diretórios-printf '%f\n
imprime apenas o nome da pasta encontrada (mais uma nova linha) para cada ocorrência.Et voilà!
fonte
while..done
loop, você pode enlouquecer.find
A-exec
opção de permite executar qualquer comando para cada arquivo / diretório.Todas as respostas usadas até agora
find
, então aqui está uma com apenas o shell. Não há necessidade de ferramentas externas no seu caso:fonte
find
quando você pode anexar uma barra para um curingafor dir in */; do echo $dir; done
é para diretórios no diretório atual.dir=${dir%*/}
eecho ${dir##*/}
está fazendo./tmp/*/
; seria recomendável incluir uma verificação para ver se o diretório realmente existe.Você pode percorrer todos os diretórios, incluindo diretórios ocultos (começando com um ponto) com:
nota: o uso da lista
*/ .*/
funciona no zsh apenas se existir pelo menos um diretório oculto na pasta. No bash, mostrará também.
e..
Outra possibilidade do bash incluir diretórios ocultos seria usar:
Se você deseja excluir links simbólicos:
Para gerar apenas o nome do diretório à direita (A, B, C, conforme questionado) em cada solução, use-o nos loops:
Exemplo (isso também funciona com diretórios que contêm espaços):
fonte
Funciona com diretórios que contêm espaços
Inspirado por Sorpigal
Postagem original (não funciona com espaços)
Inspirado por Boldewyn : Exemplo de loop com
find
comando.fonte
fonte
basename
. Eu preferiria isso à minha resposta.A técnica que eu uso com mais frequência é
find | xargs
. Por exemplo, se você deseja tornar todos os arquivos neste diretório e todos os seus subdiretórios legíveis pelo mundo, você pode:A
-print0
opção termina com um caractere NULL em vez de um espaço. A-0
opção divide sua entrada da mesma maneira. Portanto, essa é a combinação a ser usada em arquivos com espaços.Você pode imaginar essa cadeia de comandos como pegando cada saída de linha
find
e colando-a no final de umchmod
comando.Se o comando que você deseja executar como argumento no meio, e não no final, precisa ser um pouco criativo. Por exemplo, eu precisava mudar para todos os subdiretórios e executar o comando
latemk -c
. Então eu usei (da Wikipedia ):Isso tem o efeito de
for dir $(subdirs); do stuff; done
, mas é seguro para diretórios com espaços em seus nomes. Além disso, as chamadas separadas parastuff
são feitas no mesmo shell, e é por isso que no meu comando temos que retornar ao diretório atual compopd
.fonte
um loop bash mínimo do qual você pode criar (com base na resposta ghostdog74)
compactar um monte de arquivos por diretório
fonte
directory
, não apenas os subdiretórios.find . -type d -maxdepth 1
fonte
Se você deseja executar vários comandos em um loop for, é possível salvar o resultado de
find
withmapfile
(bash> = 4) como uma variável e percorrer a matriz com${dirlist[@]}
. Também funciona com diretórios contendo espaços.O
find
comando é baseado na resposta de Boldewyn. Mais informações sobre ofind
comando podem ser encontradas lá.fonte