Wenn das Parsen der Ausgabe von ls
gefährlich ist, weil einige funky Zeichen (Leerzeichen ,, \n
...) beschädigt werden können, wie lässt sich die Anzahl der Dateien in einem Verzeichnis am besten ermitteln?
Ich verlasse mich normalerweise darauf find
, dieses Parsen zu vermeiden, find mydir | wc -l
werde aber aus den gleichen Gründen ebenfalls brechen.
Ich arbeite gerade an Solaris, suche aber nach einer Antwort, die für verschiedene Unices und Shells so portabel wie möglich ist.
find
erhalten Sie die Anzahl der Dateien rekursiv (verwenden-maxdepth 1
Sie, wenn Sie das nicht möchten.find mydir -maxdepth 1 -type f -printf \\n | wc -l
sollten die Sonderzeichen im Dateinamen behandeln, da sie überhaupt nicht gedruckt werden.Antworten:
Wie wäre es mit diesem Trick?
So tragbar wie
find
undwc
.quelle
n+1
Dateien auf meinem Debian-System angezeigt ). Es wird auch nicht nach regulären Dateien gefiltert.find
Befehl an Ihre spezifischen Anforderungen anpassen . Ja, dieses enthält alle Verzeichnisse, einschließlich.
(weshalb Sie das Ergebnis möglicherweise als sehenn+1
).find . -maxdepth 1 ! -name . -exec echo \; | wc -l
; Einige ältere Versionen vonfind
haben nicht-not
.-maxdepth
kein Standard ist (eine GNU-Erweiterung, die jetzt auch von einigen anderen Implementierungen unterstützt wird).Mit Bash, ohne externe Dienstprogramme oder Schleifen:
In ksh- ersetzen
shopt -s dotglob
durchFIGNORE=.?(.)
. Ersetzen Sie es in zsh durchsetopt glob_dots
oder entfernen Sie denshopt
Anruf und verwenden Siefiles=(*(D))
. (Oder lassen Sie einfach die Zeile fallen, wenn Sie keine Punktdateien einfügen möchten.) Portabel, wenn Sie sich nicht für Punktdateien interessieren:Wenn Sie Punktdateien einschließen möchten:
quelle
1
für ein leeres Verzeichnis, wennnullglob
es nicht aktiviert ist. In zsh führta=(*(DN));echo ${#a}
das QualifikationsmerkmalN
(nullglob
) nicht zu einem Fehler für ein leeres Verzeichnis.Sollte für Post-80-Systeme ziemlich portabel sein.
Das zählt alle Verzeichniseinträge außer
.
und..
im aktuellen Verzeichnis.So zählen Sie auch Dateien in Unterverzeichnissen:
(dass man auch auf Unix V6 (1975) portabel sein sollte, da es nicht benötigt wird
-prune
)quelle
find dirname ! -name dirname -prune -print
) gut funktioniert . Ich habe mich seitdem gefragt, ob es einen bestimmten Grund gibt,grep -c /
anstatt zu verwendenwc -l
(was wahrscheinlich häufiger zum Zählen verwendet wird).find dirname ! -name dirname
funktioniert nicht, wenn andere Verzeichnisse mit diesem Namen vorhanden sinddirname
. Es ist besser zu benutzenfind dirname/. ! -name .
.wc -l
zählt die Anzahl der Zeilen, Dateinamen können aus mehreren Zeilen bestehen, da das Zeilenumbruchzeichen genauso gültig ist wie jedes in einem Dateinamen.Versuchen:
Das
-b
hat nicht druckbare Zeichen,-A
zeigt alle Dateien außer.
und..
und eine pro Zeile (die Standardeinstellung in einer Pipe, aber gut, um explizit zu sein).Solange wir übergeordnete Skriptsprachen einschließen, ist hier ein Einzeiler in Python:
Oder mit vollem "Fund":
quelle
Yoc kann eine solche Konstruktion verwenden:
Aber ich fürchte, Sie können Fehler verursachen,
Argument list too long.
wenn Sie zu viele Dateien im Verzeichnis haben. Ich habe es jedoch in einem Verzeichnis mit 10 Milliarden Dateien getestet und es hat gut funktioniert.quelle
*
.gnu find . -maxdepth 1 -type f | wc -l
for
.Haben Sie über Perl nachgedacht, das relativ portabel sein sollte?
Etwas wie:
quelle
Versuchen Sie dies => Verwenden von ls mit den Optionen -i (für Knotennummer) & -F (Anhängt den Verzeichnisnamen mit '/').
quelle
Mit einem
perl
Einzeiler (zur besseren Lesbarkeit neu formatiert):oder
Sie können
perl
Funktionen verwenden, die Arrays wiegrep
odermap
mit der zweiten Version ändern . Sieheperldoc -f readdir
für ein Beispiel mitgrep
.quelle
Die einfachste Version, die ich ständig benutze und mit der ich nie Probleme hatte, ist:
ls -b1 | wc -l
quelle
\n
stoßen, wenn der Dateiname ein oder andere funky Zeichen enthält (ja, bestimmte Unices erlauben dies).Neben der
find
-basierte Antwort von Stéphane vorgeschlagen , hier ist eine POSIX-konforme Antwort basiert aufls
:quelle