Wie kann ich die Anzahl der Dateien in einem Verzeichnis über die Befehlszeile ermitteln?
Ich habe ein Verzeichnis mit einer großen Anzahl von Dateien. Ich sehe keinen ls
-Schalter, um die Anzahl zu ermitteln. Gibt es einen Befehlszeilen-Zauber, um die Anzahl der Dateien zu ermitteln?
195
3
Unter Verwendung einer weit gefassten Definition von "Datei"
(beachten Sie, dass versteckte Dateien nicht mitgezählt werden und davon ausgegangen wird, dass Dateinamen keine Zeilenumbruchzeichen enthalten).
Um versteckte Dateien (außer
.
und..
) einzuschließen und Probleme mit Zeilenumbrüchen zu vermeiden, ist der kanonische Weg:Oder rekursiv:
Für eine enge Definition von Datei:
Wenn Sie wissen, dass das aktuelle Verzeichnis mindestens eine nicht versteckte Datei enthält:
Dies ist natürlich auf jeden Glob verallgemeinerbar.
In einem Skript hat dies den manchmal unglücklichen Nebeneffekt, dass die Positionsparameter überschrieben werden. Sie können das umgehen, indem Sie eine Subshell oder eine Funktion (Bourne/POSIX-Version) wie folgt verwenden:
Eine alternative Lösung ist
$(ls -d -- * | wc -l)
. Wenn der Glob*
ist, kann der Befehl zu$(ls | wc -l)
verkürzt werden. Das Parsen der Ausgabe vonls
bereitet mir immer Unbehagen, aber hier sollte es funktionieren, solange Ihre Dateinamen keine Zeilenumbrüche enthalten, oder Ihrls
diese umgeht. Und$(ls -d -- * 2>/dev/null | wc -l)
hat den Vorteil, dass es den Fall eines nicht übereinstimmenden Globs elegant behandelt (d.h., es gibt in diesem Fall 0 zurück, während die Methodeset *
umständlich testen muss, ob der Glob leer sein könnte).Wenn Dateinamen Zeilenumbrüche enthalten können, ist eine Alternative,
$(ls -d ./* | grep -c /)
zu verwenden.Jede dieser Lösungen, die sich darauf verlassen, dass die Expansion eines glob an
ls
übergeben wird, kann mit einem Fehler argument list too long fehlschlagen, wenn es viele passende Dateien gibt.