Wie kann ich über die Befehlszeile die Anzahl aller auf einem System vorhandenen Dateien / Ordner zählen?
Ich kann es über eine GUI herausfinden, indem ich einfach das Eigenschaftenfenster für den gesamten /
Ordner öffne, aber es wäre schön zu wissen, wie es über die Befehlszeile gemacht wird.
Würde ich eine ganze Reihe von Befehlen benötigen oder ist nur einer möglich?
command-line
filesystem
files
search
Sag mir warum
quelle
quelle
Antworten:
Da Datei- / Ordnernamen Zeilenumbrüche enthalten können:
Dadurch werden alle Dateien / Ordner im aktuellen
/
Verzeichnis gezählt. Wie muru jedoch betont, möchten Sie möglicherweise virtuelle / andere Dateisysteme von der Zählung ausschließen (im Folgenden werden alle anderen bereitgestellten Dateisysteme ausgeschlossen):sudo find / -type f -printf '.'
: druckt einen Punkt für jede Datei in/
;sudo find / -type d -printf '.'
: druckt einen Punkt für jeden Ordner in/
;wc -c
: zählt die Anzahl der Zeichen.Hier ist ein Beispiel dafür, wie das Nichtbeachten von Zeilenumbrüchen in Datei- / Ordnernamen andere Methoden beschädigen kann, z. B.
find / -type f | wc -l
und wie die Verwendung esfind / -type f -printf '.' | wc -c
tatsächlich richtig macht:Wenn STDOUT kein Terminal ist,
find
wird jeder Datei- / Ordnername buchstäblich gedruckt. Dies bedeutet, dass ein Datei- / Ordnername, der eine neue Zeile enthält, über zwei verschiedene Zeilen gedrucktwc -l
wird. Dabei werden zwei Zeilen für eine einzelne Datei / einen Ordner gezählt, wodurch letztendlich ein Ergebnis um eins gedruckt wird.quelle
touch "file
, die Eingabetaste zu drücken, zu tippenwith newline"
und die Eingabetaste zu drücken. Dadurch wird eine Datei mit einem Zeilenumbruch erstellt. Versuchen Sie dann zu laufenls | wc -l
,find . -type f | wc -l
oder was auch immer; Sie werden sehen, dass die Anzahl der Dateien nicht übereinstimmt, da die neue Zeile eine zusätzliche Ausgabezeile erstellt, sodass diese einzelne Datei tatsächlich zweimal gezählt wird.-xdev
oder zumindest ausschließen/proc
,/sys
und wahrscheinlich/dev
auch.-not -type d
würde alle Nicht-Verzeichnis-Dateitypen zählen. Oder vielleicht möchten Sie keine Symlinks zählen.1 Methode wäre
(Sudo, um den Zugriff auf Fehler zu verhindern)
f für Dateien, d für Verzeichnisse.
Das / proc / Dateisystem wird fehlerhaft sein, aber ich berücksichtige diese Dateien nicht;)
quelle
find: ‘/run/lock/schroot’: Permission denied
-xdev
oder zumindest ausschließen/proc
,/sys
und wahrscheinlich/dev
auch.Wenn Sie wirklich die Gesamtzahl der Objekte in Ihren Dateisystemen möchten , verwenden Sie diese Option, um
df -i
Inodes zu zählen. Sie werden nicht die Aufteilung zwischen Verzeichnissen und einfachen Dateien erhalten, aber auf der positiven Seite läuft es fast sofort. Die Gesamtzahl der verwendeten Inodes wird von Dateisystemen bereits verfolgt.Wenn Sie einen der
find
Vorschläge verwenden möchten , führen Sie ihn nicht einfach aus/
. Verwenden Siefind -xdev
auf einer Liste von Einhängepunkten, die von etwas wiefindmnt --list -v -U -t xfs,ext3,ext4,btrfs,vfat,ntfs -o TARGET
oder etwas generiert wurden . Das schließt jedoch Bind-Mounts nicht aus, sodass Dateien unter Bind-Mounts zweimal gezählt werden.findmnt
ist ziemlich cool.Es gibt sicherlich auch eine einfache Möglichkeit, alle "Festplatten" -Mounts aufzulisten, ohne explizite Dateisystemtypen auflisten zu müssen, aber ich bin mir nicht sicher, was genau.
Verwenden Sie diese Option,
find -printf . | wc -c
um mögliche Probleme beim Zählen lustiger Zeichen in Dateinamen zu vermeiden. Verwenden Sie-not -type d
diese Option, um Nicht-Verzeichnisdateien zu zählen. (Sie möchten Ihre Symlinks nicht ausschließen, oder?)quelle
stat
. Wenn Sie beide verwendenstat -f /
oderdf -i /
Daten über denstatfs
Systemaufruf abrufen, sollte die Ausgabe dieser beiden Befehle immer konsistent sein.df -i
Scheint nicht auf allen Dateisystemen zu funktionieren. zBbtrfs
zeigt es 0 Inodes.zeigt Ihnen die Anzahl der regulären Dateien auf Ihrem System an und
die Anzahl der Ordner.
quelle
Verwenden von
zsh
:Wie
root
für reguläre Dateien:Dadurch werden alle regulären Dateien, einschließlich derjenigen, die mit a beginnen,
.
in das Array aufgenommenfiles
. Jetzt können wir einfach die Anzahl der Elemente des Arrays zählen:Dies behandelt alle Randfälle, z. B. ungewöhnliche Dateinamen.
Ähnliches gilt für Verzeichnisse:
quelle
/*/**/*(.D)
..auch dies ist nicht richtig, da es jede Datei in/
Ein weiterer Ansatz, der Folgendes nutzt
locatedb
:Vorteile:
find
basierten Ansätze (bereits vorindiziert)-xdev
: dh überspringt spezielle Dateien:/dev
,/proc
usw.Nachteile:
/tmp
, kann beispielsweise Dateien mit Zeilenumbrüchen im Namen doppelt oder mehr zählendf -i
Ansatzquelle