Ich möchte wissen, wie viele reguläre Dateien die Erweiterung .c
in einer großen komplexen Verzeichnisstruktur haben und wie viele Verzeichnisse sich auf diese Dateien verteilen. Die Ausgabe, die ich möchte, sind nur diese beiden Zahlen.
Ich habe diese Frage zum Abrufen der Anzahl der Dateien gesehen, muss aber auch die Anzahl der Verzeichnisse kennen, in denen sich die Dateien befinden.
- Meine Dateinamen (einschließlich der Verzeichnisse) können beliebige Zeichen enthalten. Sie können mit
.
oder beginnen-
und Leerzeichen oder Zeilenumbrüche enthalten. - Ich könnte einige Symlinks haben, deren Namen mit
.c
und Symlinks zu Verzeichnissen enden . Ich möchte nicht, dass Symlinks verfolgt oder gezählt werden, oder ich möchte zumindest wissen, ob und wann sie gezählt werden. - Die Verzeichnisstruktur besteht aus mehreren Ebenen und das oberste Verzeichnis (das Arbeitsverzeichnis) enthält mindestens eine
.c
Datei.
Ich habe einige Befehle hastig in die (Bash-) Shell geschrieben, um sie selbst zu zählen, aber ich glaube nicht, dass das Ergebnis korrekt ist ...
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
Dies gibt Beschwerden über mehrdeutige Weiterleitungen aus, verpasst Dateien im aktuellen Verzeichnis und stößt auf Sonderzeichen (bei einer umgeleiteten find
Ausgabe werden beispielsweise Zeilenumbrüche in Dateinamen gedruckt ) und schreibt eine ganze Reihe leerer Dateien (oops).
Wie kann ich meine .c
Dateien und die darin enthaltenen Verzeichnisse zuverlässig auflisten ?
Falls es hilft, sind hier einige Befehle zum Erstellen einer Teststruktur mit falschen Namen und Symlinks:
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
In der resultierenden Struktur enthalten 7 Verzeichnisse .c
Dateien und 29 reguläre Dateien enden mit .c
(wenn dotglob
deaktiviert, wenn die Befehle ausgeführt werden) (wenn ich falsch gezählt habe, lassen Sie es mich bitte wissen). Das sind die Zahlen, die ich will.
Fühlen Sie sich bitte frei , diesen speziellen Test nicht zu verwenden.
NB: Antworten in einer beliebigen Shell oder einer anderen Sprache werden von mir getestet und geschätzt. Wenn ich neue Pakete installieren muss, kein Problem. Wenn Sie eine GUI-Lösung kennen, empfehle ich Ihnen, sie zu teilen (aber ich gehe möglicherweise nicht so weit, um eine ganze DE zu installieren, um sie zu testen) :) Ich verwende Ubuntu MATE 17.10.