Contagem recursiva do número de subdiretórios

0

Existe algum comando ou grupo de comandos que possa contar o número de todos os subdiretórios de forma recursiva, começando com uma determinada letra específica?

    
por Abiral 08.12.2015 / 17:31

2 respostas

4

Você pode usar uma combinação dos comandos find e wc

Por exemplo, para contar os diretórios que começam no diretório atual . e começam com a letra 's'

find . -type d -name 's*' -printf "1" | wc -c

A condição -name corresponde ao nome do diretório, usando regras de correspondência de padrões de shell (também é possível corresponder usando a sintaxe de expressão regular , no entanto isso seria um overkill aqui). A parte -printf "1" imprime o caractere 1 sempre que uma correspondência é encontrada e wc -c conta esses caracteres.

A escolha de 1 como caractere impresso e contado é arbitrária.

Para exibir e , você pode fazer

find . -type d -name 's*' | tee >(wc -l)

no entanto, esteja ciente de que a contagem pode ser imprecisa se qualquer nome de diretório incluir caracteres de nova linha (raros - mas legais).

    
por steeldriver 08.12.2015 / 17:34
0

Com o one-liner de python:

$ tree top
top
├── sub1
│   └── another_subdir
├── sub2
└── sub3

4 directories, 0 files

$ python -c 'import os,sys;print(sum([ 1 for r,s,f in os.walk(sys.argv[1]) for i in s if i.startswith("s")    ]))' ./top                             
3

O one-liner funciona assim:

  • Vamos passar o diretório que queremos percorrer como argumento de linha de comando, e para isso precisamos de sys module, enquanto que para a passagem de diretório precisamos de os.walk() function - daí precisamos de 'os module.
  • print() imprimirá a saída de sum() , que soma todos os itens dentro da lista que criamos por meio da compreensão da lista (o formulário [i for i in iterable] ).
  • A compreensão da lista pode ser tratada como dois loops aninhados. Em cada iteração os.walk() fornece o diretório principal, sua lista de subdiretórios e sua lista de arquivos. Quando iterarmos a lista de subdiretórios s , verificaremos se cada subdiretório começa com a letra s , através do método .startswith() e, se houver, 1 será colocado na lista. Assim, sum() irá basicamente somar uma longa lista de 1s.
por Sergiy Kolodyazhnyy 15.07.2017 / 01:52