Allgemeine Hinweise zur Verarbeitung von Dateinamen, die möglicherweise Leerzeichen enthalten, finden Sie unter Warum verschluckt sich mein Shell-Skript an Leerzeichen oder anderen Sonderzeichen?
Die Schwierigkeit bei dem, was Sie versuchen, besteht darin, dass es keine gute Möglichkeit gibt, die N neuesten Dateien mit Standardwerkzeugen aufzulisten.
Der einfachste Weg, das zu tun, was Sie hier tun, besteht darin, zsh als Shell zu verwenden. Es verfügt über Glob-Qualifizierer zum Sortieren von Dateien nach Datum. So führen Sie file
die 500 neuesten Dateien aus:
file *(om[1,500])
Übergeben Sie mit dem Linux- file
Dienstprogramm die Option -i
oder --mime-type
, um eine Ausgabe zu erhalten, die einfacher zu analysieren ist. Bilddateien werden durch Zeilen gekennzeichnet, die mit enden image/something
.
file --mime-type *(om[1,500]) | sed -n 's~: *image/[^ ]*$~~p'
Wenn Sie mit absolut allen Dateinamen fertig werden müssen, einschließlich derer mit einem Zeilenumbruch im Namen, verwenden Sie die -0
Option für eine durch Nullen getrennte Ausgabe. Neuere Versionen von GNU sed können anstelle von Zeilenumbrüchen Null-Bytes als Datensatztrennzeichen verwenden.
file --mime-type -- *(om[1,500]) | sed -zn 's~: *image/[^ ]*$~~p'
Wenn Sie nicht über zsh verfügen, können Sie ls
Dateinamen verwenden und verarbeiten, die Leerzeichen, aber keine Zeilenumbrüche oder nachgestellten Leerzeichen enthalten, indem Sie die -L1
Option an übergeben file
. Dies wird jeweils file
für eine Datei aufgerufen , ist also etwas langsamer.
ls -t | head -n 500 | xargs -L1 file --mime-type -- | sed -n 's~: *image/[^ ]*$~~p'
xargs
Implementierungen kann das Trennzeichen beispielsweise in geändert werden'\n'
. Dies ist häufig hilfreich, wenn die Eingabe nicht von generiert wirdfind
. Siehe-d
(GNU) und-E
(OSX)