Como limitar a profundidade da lista de arquivos recursivos?

346

Existe uma maneira de limitar a profundidade de uma lista de arquivos recursivos no linux?

O comando que estou usando no momento é:

ls -laR > dirlist.txt

Mas eu tenho cerca de 200 diretórios e cada um deles tem dez diretórios. Portanto, isso levará muito tempo e consumirá muitos recursos do sistema.

Estou realmente interessado nas informações de propriedade e permissões dos subdiretórios de primeiro nível:

drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/htdocs  
drwxr--r-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain1.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/htdocs  
drwxr-xrwx 14 proftp root  1234 Dec 22 13:19 /var/www/vhosts/domain2.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/htdocs  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain3.co.uk/cgi-bin  
drwxr-xr-x 14 root   root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk  
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/htdocs
drwxr-xr-- 14 jon    root  1234 Dec 22 13:19 /var/www/vhosts/domain4.co.uk/cgi-bin

EDITAR:

Escolha final do comando:

find -maxdepth 2 -type d -ls >dirlist
Jon
fonte
3
Você também poderia algo assim ls -la /var/www/vhosts/*?
precisa saber é o seguinte

Respostas:

494

Confira a -maxdepthbandeira defind

find . -maxdepth 1 -type d -exec ls -ld "{}" \;

Aqui eu usei 1 como profundidade máxima de nível, -type dsignifica encontrar apenas diretórios, que depois ls -ldlistam o conteúdo, em formato longo.

Alberto Zaccagni
fonte
2
Como o OP deseja conhecer as permissões dos próprios diretórios, você deve adicionar a -dopção ls.
Peter van der Heijden
@ Peter van der Heijden: Acabei de escrever a findparte para resolver seu principal problema. De qualquer forma, obrigado, eu estou adicionando.
Alberto Zaccagni
3
Eu uso -print0e xargs -0muito. Exemplo:find . -maxdepth 1 -type d -print0 | xargs -0 ls -d
Chris K
2
Ah, sim, definitivamente parece errado, sabe, há seis anos: D Eu já comentei em stackoverflow.com/a/25618630/57095 que deveria ser a resposta aceita.
Alberto Zaccagni
ahhh maxdepth, existe uma opção de profundidade?
Alexander Mills
95

Faça uso das findopções de

Na verdade, não há nenhum executivo /bin/lsnecessário;

O Find tem uma opção que faz exatamente isso:

find . -maxdepth 2 -type d -ls

Para ver apenas o nível de subdiretórios de seu interesse, adicione -mindeptho mesmo nível que -maxdepth:

find . -mindepth 2 -maxdepth 2 -type d -ls


Use formatação de saída

Quando os detalhes mostrados devem ser diferentes, -printfpode mostrar qualquer detalhe sobre um arquivo em formato personalizado; Para mostrar as permissões simbólicas e o nome do proprietário do arquivo, use -printfcom %Me %uno format.

Mais tarde, notei que você deseja obter todas as informações de propriedade, que incluem o grupo. Use %gno formato para o nome simbólico ou %Gpara o ID do grupo (como também %Upara o ID numérico do usuário)

find . -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'

Isso deve fornecer os detalhes necessários, para os arquivos certos.

Vou dar um exemplo que mostra valores realmente diferentes para usuário e grupo:

$ sudo find /tmp -mindepth 2 -maxdepth 2 -type d -printf '%M %u %g %p\n'
drwx------ www-data  www-data /tmp/user/33
drwx------ octopussy root     /tmp/user/126
drwx------ root      root     /tmp/user/0
drwx------ siegel    root     /tmp/user/1000
drwxrwxrwt root      root     /tmp/systemd-[...].service-HRUQmm/tmp

(Editado para facilitar a leitura: última linha recuada, encurtada)


Notas sobre desempenho

Embora o tempo de execução seja principalmente irrelevante para esse tipo de comando, o aumento no desempenho é grande o suficiente aqui para fazer valer a pena destacar:

Não apenas salvamos a criação de um novo processo para cada nome - uma tarefa enorme - a informação nem precisa ser lida, como findjá a conhecemos.

Volker Siegel
fonte
9
Essa deve ser a resposta aceita, muito melhor que a minha.
Alberto Zaccagni 04/04
11
@AlbertoZaccagni Acho que gostamos de respostas curtas para que as coisas funcionem rapidamente.
precisa saber é o seguinte
65

tree -L 2 -u -g -p -d

Imprime a árvore de diretórios em um formato bonito até a profundidade 2 (-L 2). Imprima usuário (-u) e grupo (-g) e permissões (-p). Imprima apenas diretórios (-d). A árvore tem muitas outras opções úteis.

Sameer
fonte
12
árvore é amor. árvore é vida.
yosefrow 2/02
Simplesmente tree -L 2 xxx/ou tree -L 2 -d xxx/é suficiente para alguns casos.
Eric Wang
1

Tudo o que realmente me interessa são as informações de propriedade e permissões para os subdiretórios de primeiro nível.

Encontrei uma solução fácil enquanto brincava com o meu peixe, que se encaixa perfeitamente na sua necessidade.

ll `ls`

ou

ls -l $(ls)
recolic
fonte