user4556274 hat das warum bereits beantwortet . Meine Antwort dient nur dazu, zusätzliche Informationen darüber, wie richtig Dateien zählen zu.
In der Unix-Community herrschtls
allgemeiner Konsens darüber, dass das Parsen der Ausgabe eine sehr, sehr schlechte Idee ist , da Dateinamen Steuerzeichen oder versteckte Zeichen enthalten können. Aufgrund eines Zeilenumbruchs in einem Dateinamen müssen wir uns beispielsweise ls | wc -l
mitteilen, dass die Ausgabe von 5 Zeilen enthält ls
(was auch der Fall ist), in Wirklichkeit befinden sich jedoch nur 4 Dateien im Verzeichnis.
$> touch FILE$'\n'NAME
$> ls
file1.txt file2.txt file3.txt FILE?NAME
$> ls | wc -l
5
Methode 1: finden Sie Dienstprogramm
Der find
Befehl, der normalerweise zum Analysieren von Dateinamen verwendet wird, kann uns hier helfen, indem er die Inode-Nummer ausgibt . Sei es ein Verzeichnis oder eine Datei, es hat nur eine einzige Inode-Nummer. Durch die Verwendung -printf "%i\n"
und den Ausschluss von .
via können -not -name "."
wir die Dateien genau zählen. (Beachten Sie die Verwendung von -maxdepth 1
, um ein rekursives Absteigen in Unterverzeichnisse zu verhindern.)
$> find -maxdepth 1 -not -name "." -print
./file2.txt
./file1.txt
./FILE?NAME
./file3.txt
$> find -maxdepth 1 -not -name "." -printf "%i\n" | wc -l
4
Methode 2: Globstar
Einfach, schnell und meistens portabel:
$ set -- *
$ echo $#
228
set
Befehl wird verwendet, um Positionsparameter der Shell festzulegen (die $<INTEGER>
Variablen, wie in echo $1
). Dies wird häufig verwendet, um die /bin/sh
Begrenzung fehlender Arrays zu umgehen. Eine Version, die zusätzliche Prüfungen durchführt, finden Sie in Gilles Antwort unter Unix & Linux.
In Shells, die Arrays unterstützen, wie bash
wir sie verwenden können
items=( dir/* )
echo ${#items[@]}
wie von steeldriver in den Kommentaren vorgeschlagen .
Ein ähnlicher Trick wie bei der find
Methode "which used" wc
und "globstar" kann stat
zum Zählen der Inode-Nummern pro Zeile verwendet werden:
$> LC_ALL=C stat ./* --printf "%i\n" | wc -l
4
Ein alternativer Ansatz ist die Verwendung eines Platzhalters in einer for
Schleife. (Beachten Sie, dass dieser Test ein anderes Verzeichnis verwendet, um zu testen, ob dieser Ansatz in Unterverzeichnisse abfällt, was nicht der Fall ist. 16 ist die überprüfte Anzahl von Elementen in my. ~/bin
)
$> count=0; for item in ~/bin/* ; do count=$(($count+1)) ; echo $count ; done | tail -n 1
16
Methode 3: Andere Sprachen / Dolmetscher
Python kann auch mit problematischen Dateinamen umgehen, indem es die Länge einer Liste in Anbetracht meiner os.listdir()
Funktion ausgibt (was nicht rekursiv ist und nur Elemente in dem als Argument angegebenen Verzeichnis auflistet).
$> python -c "import os ; print os.listdir('.')"
['file2.txt', 'file1.txt', 'FILE\nNAME', 'file3.txt']
$> python -c "import os ; print(len(os.listdir('.')))"
4
Siehe auch
ls | wc -l
schlägt fehl, wenn der Dateiname Dateien mit einer neuen Zeile enthält. Dies ist widerstandsfähiger:find . -mindepth 1 -maxdepth 1 -printf . | wc -c