Quero saber quantos arquivos regulares têm a extensão .c
em uma estrutura de diretórios grande e complexa e também quantos diretórios esses arquivos estão espalhados. A saída que eu quero é apenas esses dois números.
Vi essa pergunta sobre como obter o número de arquivos, mas também preciso saber o número de diretórios em que os arquivos estão.
- Meus nomes de arquivos (incluindo diretórios) podem ter caracteres; eles podem começar com
.
ou-
e ter espaços ou novas linhas. - Talvez eu tenha alguns links simbólicos cujos nomes terminem com
.c
e links simbólicos para diretórios. Não quero que links simbólicos sejam seguidos ou contados, ou pelo menos quero saber se e quando eles estão sendo contados. - A estrutura de diretórios possui muitos níveis e o diretório de nível superior (o diretório de trabalho) possui pelo menos um
.c
arquivo.
Escrevi rapidamente alguns comandos no shell (Bash) para contá-los, mas não acho que o resultado seja preciso ...
shopt -s dotglob
shopt -s globstar
mkdir out
for d in **/; do
find "$d" -maxdepth 1 -type f -name "*.c" >> out/$(basename "$d")
done
ls -1Aq out | wc -l
cat out/* | wc -l
Isso gera reclamações sobre redirecionamentos ambíguos, perde arquivos no diretório atual e ativa caracteres especiais (por exemplo, a saída redirecionada find
imprime novas linhas nos nomes de arquivos ) e grava um monte de arquivos vazios (oops).
Como enumerar meus .c
arquivos de maneira confiável e os diretórios que os contêm?
Caso isso ajude, aqui estão alguns comandos para criar uma estrutura de teste com nomes incorretos e links simbólicos:
mkdir -p cfiles/{1..3}/{a..b} && cd cfiles
mkdir space\ d
touch -- i.c -.c bad\ .c 'terrible
.c' not-c .hidden.c
for d in space\ d 1 2 2/{a..b} 3/b; do cp -t "$d" -- *.c; done
ln -s 2 dirlink
ln -s 3/b/i.c filelink.c
Na estrutura resultante, 7 diretórios contêm .c
arquivos e 29 arquivos regulares terminam com .c
(se dotglob
estiver desativado quando os comandos forem executados) (se eu tiver errado a conta, informe-me). Estes são os números que eu quero.
Por favor, sinta-se livre para não usar este teste específico.
NB: Respostas em qualquer shell ou outro idioma serão testadas e apreciadas por mim. Se eu tiver que instalar novos pacotes, não há problema. Se você conhece uma solução GUI, recomendo que você compartilhe (mas talvez não vá tão longe quanto instalar um DE inteiro para testá-lo) :) Eu uso o Ubuntu MATE 17.10.