Wie zähle ich die Gesamtzahl der Dateien / Ordner auf einem System?

7

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?

Sag mir warum
quelle
2
Möchten Sie die Anzahl der Dateien oder die Anzahl der Links?
Jörg W Mittag

Antworten:

11

Da Datei- / Ordnernamen Zeilenumbrüche enthalten können:

sudo find / -type f -printf '.' | wc -c
sudo find / -type d -printf '.' | wc -c

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):

find / -xdev -type f -printf '.' | wc -c
find / -xdev -type d -printf '.' | wc -c
  • 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 -lund wie die Verwendung es find / -type f -printf '.' | wc -ctatsächlich richtig macht:

% ls
% touch "file
\`dquote> with newline"
% find . -type f | wc -l
2
% find . -type f -printf '.' | wc -c
1

Wenn STDOUT kein Terminal ist, findwird jeder Datei- / Ordnername buchstäblich gedruckt. Dies bedeutet, dass ein Datei- / Ordnername, der eine neue Zeile enthält, über zwei verschiedene Zeilen gedruckt wc -lwird. Dabei werden zwei Zeilen für eine einzelne Datei / einen Ordner gezählt, wodurch letztendlich ein Ergebnis um eins gedruckt wird.

kos
quelle
ein Name "mit Zeilenumbrüchen"? Was meinst du?
TellMeWhy
5
@ DevRobot Dateien / Ordner in * nix-Systemen können Zeilenumbrüche enthalten. Es ist in der Tat ein Randfall, aber es kann passieren. Versuchen Sie erneut zu tippen touch "file, die Eingabetaste zu drücken, zu tippen with newline"und die Eingabetaste zu drücken. Dadurch wird eine Datei mit einem Zeilenumbruch erstellt. Versuchen Sie dann zu laufen ls | wc -l, find . -type f | wc -loder 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.
Kos
Nett! Dies ist die eindeutige Antwort auf die Frage
:)
3
Sie sollten verwenden -xdevoder zumindest ausschließen /proc, /sysund wahrscheinlich /devauch.
Muru
1
-not -type dwürde alle Nicht-Verzeichnis-Dateitypen zählen. Oder vielleicht möchten Sie keine Symlinks zählen.
Peter Cordes
7

1 Methode wäre

sudo find / -type f | wc -l
sudo find / -type d | wc -l

(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;)

Rinzwind
quelle
brauche ich sudo Alle Dateien sind wie find: ‘/run/lock/schroot’: Permission denied
folgt
Ja. Ich habe "Erlaubnis verweigert", es als Benutzer
auszuführen
Ich habe 483664 ... nicht so viele wie ich erwartet habe - macht das aber Sinn?
TellMeWhy
Ich habe weniger: D Hmmm. lustig Sie werden auf 1 Problem stoßen: Das / proc / System ändert sich immer.
Rinzwind
1
Sie sollten verwenden -xdevoder zumindest ausschließen /proc, /sysund wahrscheinlich /devauch.
Muru
5

Wenn Sie wirklich die Gesamtzahl der Objekte in Ihren Dateisystemen möchten , verwenden Sie diese Option, um df -iInodes 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 findVorschläge verwenden möchten , führen Sie ihn nicht einfach aus /. Verwenden Sie find -xdevauf einer Liste von Einhängepunkten, die von etwas wie findmnt --list -v -U -t xfs,ext3,ext4,btrfs,vfat,ntfs -o TARGEToder 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 -cum mögliche Probleme beim Zählen lustiger Zeichen in Dateinamen zu vermeiden. Verwenden Sie -not -type ddiese Option, um Nicht-Verzeichnisdateien zu zählen. (Sie möchten Ihre Symlinks nicht ausschließen, oder?)

Peter Cordes
quelle
2
Dies ist ein besserer Ansatz als alle anderen Antworten, die darauf hindeuten, das gesamte Dateisystem zu durchlaufen. Ein anderes Befehlszeilenprogramm, das ebenfalls verwendet werden könnte, ist stat. Wenn Sie beide verwenden stat -f /oder df -i /Daten über den statfsSystemaufruf abrufen, sollte die Ausgabe dieser beiden Befehle immer konsistent sein.
Kasperd
1
Hinweis: df -iScheint nicht auf allen Dateisystemen zu funktionieren. zB btrfszeigt es 0 Inodes.
Arielf
4
sudo find / -type f | wc -l

zeigt Ihnen die Anzahl der regulären Dateien auf Ihrem System an und

sudo find / -type d | wc -l

die Anzahl der Ordner.

Florian Diesch
quelle
2

Verwenden von zsh:

Wie rootfür reguläre Dateien:

files=( /**/*(.D) )

Dadurch werden alle regulären Dateien, einschließlich derjenigen, die mit a beginnen, .in das Array aufgenommen files. Jetzt können wir einfach die Anzahl der Elemente des Arrays zählen:

echo $#files

Dies behandelt alle Randfälle, z. B. ungewöhnliche Dateinamen.

Ähnliches gilt für Verzeichnisse:

dirs=( /**/*(/D) )
echo $#dirs
heemayl
quelle
@kos: aber dann müssen manuell zwischen regulären Dateien und anderen unterscheiden ..
heemayl
@kos Nein ..dann brauchen Sie /*/**/*(.D)..auch dies ist nicht richtig, da es jede Datei in/
heemayl
2

Ein weiterer Ansatz, der Folgendes nutzt locatedb:

locate / | wc -l

Vorteile:

  • Benötigt kein Sudo
  • Viel schneller als die findbasierten Ansätze (bereits vorindiziert)
  • Bereits gilt -xdev: dh überspringt spezielle Dateien: /dev, /procusw.

Nachteile:

  • Nicht 100% genau: Enthält Verzeichnisse, überspringt Dateien unter /tmp, kann beispielsweise Dateien mit Zeilenumbrüchen im Namen doppelt oder mehr zählen
  • Langsamer als der df -iAnsatz
  • Reflektiert eher die "letzte ~ 24-Stunden-Schnappschuss-Realität" als den genauen aktuellen Zustand
arielf
quelle