Contar número de diretórios

0

Eu preciso de um script ou comando que imprima vários diretórios cujo nome comece com "lib" na subárvore do diretório inteiro. Eu estava tentando fazer isso usando find, grep e wc, mas não consigo varrer todos os diretórios. Como fazer isso?

    
por Zhyhalo Oleksandr 29.06.2017 / 14:08

4 respostas

3
find . -type d -name lib\* -exec echo x \; | wc -l
    
por 29.06.2017 / 14:11
5
LC_ALL=C find .//. -name 'lib*' -type d | grep -c //

Você não pode usar find . | wc -l , pois isso não funcionaria corretamente se houvesse caminhos de arquivo com caracteres de nova linha.

Sem LC_ALL=C que pode falhar na contagem de nomes de diretas que começam com lib , mas onde o restante do nome contém bytes que não formam caracteres válidos.

com zsh :

(){echo $#} **/lib*(DN/)
    
por 29.06.2017 / 15:31
0

Assumindo que todos os lib -diretórios têm nomes sãos sem novas linhas ou outros caracteres estranhos / exóticos:

find / -type d -name "lib*" -print | wc -l

Isso pressupõe que você, pela "subárvore de diretório inteiro", signifique "em qualquer lugar". Altere / para . para contar apenas no diretório atual ou abaixo.

O comando find encontrará todos os diretórios ( -type d ) cujo nome começa com lib ( -name "lib*" ) e imprime esses ( -print ).

O wc -l contaria o número de linhas na saída de find .

    
por 29.06.2017 / 15:29
0

Aqui está uma solução somente bash, usando a opção globstar shell:

$ shopt -s globstar; c=0; for f in ** ; do echo "${f##*/}"; [[ "${f##*/}" =~ ^lib* ]] && [[ -d "$f" ]]  && ((c++)); done ; echo $c

Ou em formato de script para legibilidade:

#!/usr/bin/env bash
shopt -s globstar 
c=0
for f in **
do 
    echo "${f##*/}"
    if [[ "${f##*/}" =~ ^lib* ]] && [[ -d "$f" ]]
    then 
        ((c++))
    done
echo $c

globstar nos permite habilitar globalização recursiva e via [[ com correspondência de padrão e -d sinalizador para verificar se é um diretório, incrementamos a variável de contador $c , que imprimimos no final.

    
por 30.06.2017 / 23:43