Zu Testzwecken möchte ich zählen, wie viele Bilddateien sich in einem Verzeichnis befinden, wobei jeder Bilddateityp durch die Dateierweiterung getrennt wird (jpg = "yes". Dies ist nützlich, da es später für ein anderes Skript nützlich ist, das eine Aktion ausführt auf jeder Dateierweiterung). Kann ich für JPEG-Dateien Folgendes verwenden?
jpg=""
count=`ls -1 *.jpg 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo jpg files found: $count ; jpg="yes"
fi
Sollte ich unter Berücksichtigung der Dateierweiterungen jpg, png, bmp, raw und anderer einen while
Zyklus verwenden, um dies zu tun?
quelle
JPG
undjpg
Dateien und wollte es rekursiv, also bestand meine Lösung darin, zu schreibenfind . -type f | awk -F . '{print tolower($NF)}' | sort | uniq -c | awk '{print $2,":",$1}'
Dies durchläuft rekursiv Dateien und zählt Erweiterungen, die übereinstimmen:
quelle
quelle
find
. Es kann auch zukünftigen Lesern dieser Antworten helfen, wenn Sie eine kurze Erläuterung Ihrer Lösung geben (falls sie diese für einen etwas anderen Fall ändern möchten).find
Standardmäßig wird das aktuelle Verzeichnis verwendet, wie ich es benutze. Ich glaube nicht, dass Gott beabsichtigt hat, dass Dateinamen Leerzeichen enthalten, aber das funktioniert in diesem Fall. Wenn Sie Zeilenumbrüche haben, dann haben Sie alles verdient, was Sie bekommen. Ich dachte über eine Erklärung nach, entschied aber, dass die Antwort dadurch zu lang wird. Ich denke, Einfachheit ist das, worauf es ankommt. 99% der Fälle in 1% der Zeit. Dies ist wahrscheinlich Version 7 kompatibel.Vielleicht kann es kürzer werden
quelle
Alles, was damit zu tun hat,
ls
führt wahrscheinlich zu unerwarteten Ergebnissen mit Sonderzeichen (Leerzeichen und andere Symbole). Jeder Bashismus (wie Arrays) ist nicht portierbar. Alles was damit zu tun hat,while read
ist normalerweise langsam.Auf der anderen Seite
find
ist es SEHR flexibel (viele Filteroptionen), es hat [mindestens] zwei Syntax, die für spezielle Zeichen ausfallsicher sind ... und es lässt sich gut in großen Verzeichnissen skalieren.In diesem Beispiel habe ich
-iname
Groß- und Kleinbuchstaben für Erweiterungsnamen verwendet. Ich habe mich auch darauf beschränkt-maxdepth 1
, Ihre Frage "im aktuellen Verzeichnis" zu respektieren. Anstatt die Anzahl der Zeilen zu zählen, in denen Dateinamen CR / LF enthalten könnten,-print0
wird am Ende jedes Dateinamens ein NULL-Byte ausgegeben ...| tr -d -c "\000" | wc -l
genaues Zählen der Dateien (NULL-Bytes!).PS
-print0 | tr -d -c "\000" | wc -c
kann mit-printf "\000" | wc -c
oder sogar ersetzt werden-printf '\n' | wc -l
.quelle
kann ls nur für etwas verwenden, das so einfach ist wie IMO
oder
oder
quelle
Wenn Sie sich der Erweiterung sicher sind, können Sie
find
gerne mitgehenquelle
touch $'foo\nbar.jpeg
und es wird zweimal statt einmal gezählt. Oder schlimmer, jemand tut esmkdir directory.jpeg; touch directory.jpeg/{1..100}.txt