find . -type d -name lib\* -exec echo x \; | wc -l
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?
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/)
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
.
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.