Ich möchte die Gesamtzahl der Dateien in einem bestimmten Verzeichnis zählen, die mit der Erweiterung ".mp4" enden.
Ich erhalte folgenden Befehl:
ls -F |grep -v / | wc -l
Es zählt alle Dateien in einem bestimmten Verzeichnis, aber ich möchte die Anzahl der Dateien, die mit der Erweiterung .mp4 enden.
Gibt es einen Ubuntu-Befehl dafür?
command-line
ls
Prakash V Holkar
quelle
quelle
ls -1
Die Behandlung von Zeilenumbrüchen macht es in diesem Fall sinnvoll, diels
Ausgabe zu analysieren . Das markierte ist für die Verwendung des Flags -R falsch.Antworten:
Hier kann man das so machen
Das gibt dir Zählung
quelle
-R
? Warum eine vollständige Datei erstellen,stat
wenn Sie nur den Dateinamen benötigen? Warum nichtls -1 *.jpg| wc -l
? (ok, funktioniert nicht, wenn Sie Dateinamen mit Zeilenumbrüchen haben. In diesem Fall haben Sie es verdient ;-) ...).jpg
. Hast du es jemals getestet?*.jpg
durch die Shell und nicht durch erweitert werdenls
) und wenn Dateien vorhanden sind, deren Namen mit Bindestrichen beginnen..
. Bei Bindestrichen in Namen funktioniert dies jedoch in Ordnung, es sei denn, es/path/to/dir
handelt sich um eine leere Zeichenfolge oder einen relativen Pfad, der mit einem Bindestrich beginnt. Aber ich habe mich vorher geirrt , gesagt,ls
Zeichen werden durch ersetzt?
. Das passiert, wenn stdout ein Terminal ist, aber hier ist die Ausgabe eine Pipe, also werdenls
alle Zeichen von Dateinamen an gesendetwc
. Das macht diese Antwort falsch, ohne das-q
oder-b
-Flag , um dieses Verhalten zu ändern , da Dateinamen Zeilenumbrüche enthalten können. Die Antwort von l0b0 ist frei von diesen Problemen.Leider ist dieses harmlose Problem auf eine Weise schwer zu lösen, die alle Dateinamen unterstützt und portierbar ist. Dies ist sicher (es behandelt versteckte Dateien, Pfade mit Leerzeichen, Bindestrichen und sogar Zeilenumbrüchen)
und POSIX-kompatibel:Wenn Sie nicht möchten, dass es rekursiv ist, fügen Sie einfach hinzu
-maxdepth 1
.Sie sollten die
ls
Ausgabe nicht analysieren .Prüfung:
Vergleichen mit der akzeptierten Antwort :
Oder andere Vorschläge:
quelle
-printf x
anstelle von verwenden-exec printf x \;
. Das heißt:find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c
Es gibt keine Notwendigkeit an-exec
den externenprintf
Befehl, der , wenn es viele Dateien werden sehr langsam , dafind
muss Gabel (2) aus einer Kopie von sich selbst und dann execve (2)/usr/bin/printf
. Mit-exec printf x \;
muss das für jede Datei einmal gemacht werden .-printf
wird in POSIX nicht unterstütztfind
, weshalb ich es nicht verwendet habe.-mindepth
und-maxdepth
, was du benutzt hast.find
enthält-mindepth
und enthält-maxdepth
aber nicht,-printf
so schätze ich die Aufnahme von beiden.Dieser findet, sortiert und listet alle Dateien nach Erweiterung in der folgenden Reihenfolge auf:
quelle
| sort -rn
am Ende und vielleicht ein-mindepth 1
wenn nur aktuelles Verzeichnis hinzufügen .head -n
, um die Spitze n zu bekommen.Ich denke, es ist sehr einfach, Befehle zu befolgen.
oder
Ich denke, dass die obigen Befehle die Anzahl der Dateien und Verzeichnisnamen berechnen
*.mp4
Daher schlage ich vor, dass Sie die folgende
-type f
Option alsfind
Parameter verwenden.Darüber hinaus
ls -lR
kann als verwendet werdenfind .
quelle
Du könntest es gebrauchen
ls -1 *.mp4 | wc -l
.Dies listet alle Dateien auf
.mp4
, die auf enden , druckt jede Datei in einer neuen Zeile (ls -1 *.mp4
) undwc
leitet die Ausgabe an, zu der die Anzahl der neuen Zeilen unter Verwendung des-l
Flags gezählt wird.quelle
*.mp4
von der Shell erweitertls
wird, schlägt dies fehl, wenn.mp4
das Verzeichnis so viele Dateien enthält, dass die Liste nichtls
als Argumente übergeben werden kann.--.mp4
--
wird den zweiten Fall lösen; Ersteres führt zu einer Fehlermeldung (Sie benötigen viele Dateien!) und einer weiteren netten Frage. Eckfälle, aber es lohnt sich zu bemerken, ja.-q
oder-b
gehen diese nicht Zeilenumbrüche in den Dateinamen tolerieren. Wenn Sie laufenls -1 *.mp4
von Ihrem Terminal ohne Rohr,ls
sieht seine stdout ein Terminal und nimmt-q
als implizierte, Druck?
s. Dieses Verhalten verschwindet jedoch, wenn der Ausgang weitergeleitet wird.ls -1 *.mp4 | wc -l
überzählt, wenn es Zeilenumbrüche gibt.ls -1 *.mp4 | cat
zeigt waswc
"sieht". (Wird auch-1
impliziert, wenn stdout kein Terminal ist, daher ist es optional.) Funktioniertls -1q -- *.mp4 | wc -l
fast, aber nicht mit null .mp4-Dateien.Dies sollte Ihnen die Liste der Dateien mit .mp4 geben
In Kombination mit erhalten
wc -l
Sie ZählungWenn die Suche Unterverzeichnisse enthalten soll
quelle
wc -l
ls /directory/*.mp4
bewirkt, dass die Shell den Glob erweitert und so etwas ausführt.ls /directory/file1.mp4 /directory/file2.mp4 ...
Dies schlägt fehl, wenn das Verzeichnis mehr mp4-Dateien enthält, als als Argumente übergeben werden könnenls
.In bash greift man kalt darauf zurück, Arrays mit glob zu verwenden:
quelle
Ersetzen Sie (.csv mit der gewünschten Erweiterung)
Erläuterung: Ich denke, dass ein einfaches Schema darin besteht, die Liste der Dateien abzurufen und die Erweiterung mit grep zu zählen.
\.
Zuordnen.
und$
Anordnen der Erweiterung am Zeilenende. Dies funktioniert, weil bei der Ausgabe von ls ein Dateiname pro Zeile gesendet wird, den Sie überprüfen können, indem Sie Folgendes ausführen:quelle
grep --count
auch verwenden könntengrep -c
.Überprüfen Sie, wie die Dateien nach Erweiterung in Linux gezählt werden? , gibt es eine gute Antwort und Erklärung, können Sie den folgenden Befehl verwenden:
quelle