Ich habe ein Verzeichnis mit einer großen Anzahl von Dateien. Ich sehe keinen ls
Schalter, um die Zählung bereitzustellen. Gibt es etwas Befehlszeilenmagie, um die Anzahl der Dateien zu ermitteln?
command-line
Blake
quelle
quelle
tree . | tail
odertree -a . | tail
versteckte Dateien / Verzeichnisse einzuschließen,tree
ist rekursiv, wenn Sie dies wünschen.Antworten:
Verwendung einer breiten Definition von "Datei"
(Beachten Sie, dass versteckte Dateien nicht gezählt werden und dass Dateinamen keine Zeilenumbrüche enthalten).
Der kanonische Weg, um versteckte Dateien (außer
.
und..
) einzuschließen und Probleme mit Zeilenumbrüchen zu vermeiden, ist:Oder rekursiv:
quelle
wc
ist ein "Word Count" -Programm. Der-l
Schalter veranlasst es, Zeilen zu zählen. In diesem Fall werden die Zeilen in der Ausgabe von gezähltls
. Auf diese Weise wurde mir auch immer beigebracht, die Anzahl der Dateien für ein bestimmtes Verzeichnis zu ermitteln.ls
diesls -1
der Fall ist, wenn der Ausgang eine Pipe ist.ls -la
, erhalten Sie drei Zeilen im Verzeichnis. Sie möchtenls -lA | wc -l
die Einträge.
und überspringen..
. Sie werden jedoch immer noch einsam sein.ls -q | wc -l
- Beachten Sie jedoch, dass versteckte Dateien bei diesem Ansatz immer noch nicht gezählt werden und Verzeichnisse gezählt werden.Für eine enge Definition der Datei:
quelle
-maxdepth 1
zum rekursiven Zählen von Dateien weglassen (oder es für die gewünschte maximale Suchtiefe einstellen).find -maxdepth 1 -type f -printf "\n" | wc -l
...
...
PS: Beachten Sie ls - <Nummer Eins> | wc - <Buchstabe-l>
quelle
ls
nicht-1
automatisch , wenn die Ausgabe an ein Rohr ist.[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
Die wahrscheinlich vollständigste Antwort mit
ls
/wc
pair istWenn Sie Punktedateien zählen möchten, und
Andernfalls.
-A
Punktedateien zu zählen, aber wegzulassen.
und..
.-q
machenls
ersetzen nongraphic Zeichen, insbesondere Zeilenende- Marke, mit?
, Ausgabe 1 Zeile für jede Datei machenUm eine einzeilige Ausgabe über das
ls
In-Terminal zu erhalten (dh ohne sie weiterzuleitenwc
), muss die-1
Option hinzugefügt werden.(Verhalten
ls
getestet mit Coreutils 8.23)quelle
-1
wird nicht benötigt. In Bezug auf „es Zeilenumbrüche in Dateinamen vernünftig mit Konsolenausgabe behandelt“ , ist dies , weil der-q
Schalter (die Sie statt verwenden sollten ,-b
weil es tragbar) , die „Kräfte jede Instanz nicht druckbaren Dateinamen Zeichen und <Tab> Zeichen geschrieben werden Implementierungen können diese Option standardmäßig bereitstellen, wenn die Ausgabe an ein Endgerät erfolgt. " Also zBls -Aq | wc -l
um alle Dateien / Verzeichnissels -qp | grep -c /
zu zählen oder nur nicht versteckte Verzeichnisse usw. zu zählen ...-b
zu-q
.Wenn Sie wissen, dass das aktuelle Verzeichnis mindestens eine nicht ausgeblendete Datei enthält:
Dies ist offensichtlich für 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 das Glob ist*
, kann der Befehl auf gekürzt werden$(ls | wc -l)
. Das Parsen der Ausgabe vonls
macht mir immer unangenehm, aber hier sollte es funktionieren, solange Ihre Dateinamen keine Zeilenumbrüche enthalten oder Siels
sie maskieren . Und$(ls -d -- * 2>/dev/null | wc -l)
hat den Vorteil, dass der Fall eines nicht übereinstimmenden Glob ordnungsgemäß behandelt werden kann (dh, in diesem Fall wird 0 zurückgegeben, wohingegen bei derset *
Methode sorgfältig geprüft werden muss, ob der Glob möglicherweise leer ist).Wenn Dateinamen Zeilenumbrüche enthalten können, können Sie auch eine Alternative verwenden
$(ls -d ./* | grep -c /)
.Jede dieser Lösungen, die darauf angewiesen sind, die Erweiterung eines Glob zu übergeben, schlägt
ls
möglicherweise mit einer zu langen Argumentliste fehl, wenn viele übereinstimmende Dateien vorhanden sind.quelle
local
oder entfernen:eval $1=$#
oder einfach verwendenecho $#
und tunnumber_of_files=$(count_words *)
.$#
(das hatten Sie vor der Bearbeitung noch nicht getan)?$1
. Was ich zählen möchte, ist die Anzahl der Parameter, die nicht der erste Parameter sind. (Ich kann nicht verwenden,shift
weil ich den Variablennamen behalten muss.) (Ähm, wenn Sie jetzt nach der ersten Zeile gefragt hätten ...)shift
wenn ich es mal richtig mache .Ich habe
du --inodes
nützlich gefunden , bin mir aber nicht sicher, welche Versiondu
es erfordert. Es sollte wesentlich schneller sein als alternative Ansätze mitfind
undwc
.Unter Ubuntu 17.10 funktioniert Folgendes:
Kombiniere mit
| sort -nr
, um absteigend nach der Anzahl der enthaltenen Inodes zu sortieren.quelle
Wenn wir mit ls / wc pair -U hinzufügen, ist dies viel schneller (nicht sortieren).
quelle
-U
ist allerdings GNU-spezifisch.Geben Sie nach der Installation des Befehls tree Folgendes ein:
tree
Wenn du auch versteckte Dateien haben willst:
tree -a
Wenn Sie Debian / Mint / Ubuntu Linux verwenden, geben Sie den folgenden Befehl ein, um den Baumbefehl zu installieren:
sudo apt-get install tree
Mit der Option -L wird die maximale Anzeigeebene des Verzeichnisbaums festgelegt. Der Befehl tree zählt nicht nur die Anzahl der Dateien, sondern auch die Anzahl der Verzeichnisse. Dabei werden so viele Ebenen des Verzeichnisbaums berücksichtigt, wie Sie möchten.
quelle
-maxdepth 1
macht es nicht rekursiv,find
ist standardmäßig rekursiv-type f
schließt nur Dateien ein-printf .
ist eine süße Geste. Es wird ein Punkt für jede Datei anstelle des Dateinamens gedruckt. Jetzt kann jeder Dateiname verarbeitet und Daten gespeichert werden. wir müssen nur die Punkte zählen :)| wc -c
zählt Zeichenquelle
Keine Pfeife, keine Schnurkopie, keine Gabel, nur einen Liner
quelle
Hier ist eine andere Technik in Anlehnung an Gilles :
Dadurch wird ein Array mit 13.923 Elementen erstellt (wenn es so viele Dateien gibt).
quelle
c
Arrays?word_count() { echo "$#"; }
wäre genug. Die Lösung von @Gilles besteht darin, den Zählerstand in einer zurückgegebenen Variablen zu speichern, um zu vermeiden, dass eine Befehlssubstitution verwendet werden muss (bei der ein Fork und eine Pipe in anderen Shells als ksh93 verwendet werden).Dies kann nur die Dateien im aktuellen Verzeichnis auflisten.
quelle
find . -type f
findet Dateien im aktuellen Verzeichnis und rekursiv auch in Unterverzeichnissen.Versuchen Sie dies, ich hoffe, diese Antwort wird Ihnen helfen
quelle
Sie können überprüfen mit:
quelle
Einige der zuvor gegebenen Antworten wurden verbessert, diesmal jedoch explizit.
Es ist wert, die Verwendung einiger geliebter Befehle wie
tail
und zu bemerkencut
. Beachten Sie außerdem, dass die Struktur standardmäßig nicht verfügbar ist. Der obige Befehl erfasst zuerst Informationen über das Verzeichnis auf Ebene 1, erhält dann die letzte Zeile,tail -n 1
in der sich unser Ziel befindet, und endet damitcut
, das dritte Wort zu nehmen.Zum Beispiel suchen in
/
:Wie wäre es dann mit der Frage nach der Anzahl der Verzeichnisse?
quelle
Verwenden Sie unter Linux Folgendes, um den Befehl sehr robust zu machen und Dateien zu verarbeiten, deren Name möglicherweise Zeilenumbrüche enthält:
Das spart uns von der Qual der Parsen
ls
ausgegeben.Verbunden:
quelle
Verwenden Sie den
tree
Befehl einfach:quelle