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?

Lösung

Unter Verwendung einer weit gefassten Definition von "Datei"

ls | wc -l

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

find . ! -name . -prune -print | grep -c /

Oder rekursiv:

find .//. ! -name . -print | grep -c //
Kommentare (6)

Für eine enge Definition von Datei:

 find . -maxdepth 1 -type f | wc -l
Kommentare (4)

Wenn Sie wissen, dass das aktuelle Verzeichnis mindestens eine nicht versteckte Datei enthält:

set -- *; echo "$#"

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:

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

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 von ls bereitet mir immer Unbehagen, aber hier sollte es funktionieren, solange Ihre Dateinamen keine Zeilenumbrüche enthalten, oder Ihr ls 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 Methode set * 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.

Kommentare (6)