Je veux savoir combien de fichiers normaux ont l'extension .c
dans une grande structure de répertoires complexes, et aussi combien de répertoires ces fichiers sont répartis sur. La sortie que je veux est juste ces deux nombres.
J'ai vu cette question sur la façon d'obtenir le nombre de fichiers, mais je dois également connaître le nombre de répertoires dans lesquels se trouvent les fichiers.
- Mes noms de fichiers (y compris les répertoires) peuvent avoir n'importe quel caractère; ils peuvent commencer par
.
ou-
et avoir des espaces ou des nouvelles lignes. - Je pourrais avoir des liens symboliques dont les noms se terminent par
.c
, et des liens symboliques vers des répertoires. Je ne veux pas que les liens symboliques soient suivis ou comptés, ou je veux au moins savoir si et quand ils sont comptés. - La structure du répertoire a plusieurs niveaux et le répertoire de niveau supérieur (le répertoire de travail) contient au moins un
.c
fichier.
J'ai écrit à la hâte quelques commandes dans le shell (Bash) pour les compter moi-même, mais je ne pense pas que le résultat soit exact ...
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
Cela génère des plaintes concernant les redirections ambiguës, des fichiers manquants dans le répertoire en cours et déclenche des caractères spéciaux (par exemple, la sortie redirigée find
affiche les nouvelles lignes dans les noms de fichiers ) et écrit tout un tas de fichiers vides (oups).
Comment puis-je énumérer de manière fiable mes .c
fichiers et leurs répertoires contenant?
Au cas où cela aiderait, voici quelques commandes pour créer une structure de test avec de mauvais noms et des liens symboliques:
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
Dans la structure résultante, 7 répertoires contiennent des .c
fichiers et 29 fichiers normaux se terminent par .c
(si dotglob
est désactivé lorsque les commandes sont exécutées) (si j'ai mal compté, faites-le moi savoir). Ce sont les chiffres que je veux.
N'hésitez pas à ne pas utiliser ce test en particulier.
NB: Les réponses dans n'importe quel shell ou autre langue seront testées et appréciées par moi. Si je dois installer de nouveaux packages, pas de problème. Si vous connaissez une solution GUI, je vous encourage à la partager (mais je n'irai peut-être pas jusqu'à installer un DE complet pour la tester) :) J'utilise Ubuntu MATE 17.10.