Es ist nicht sicher zu analysieren ls
oder zu leiten find
[ 1 , 2 ]
Es ist nicht sicher, die Ausgabe von ls
oder zu analysieren (und zu leiten) find
, hauptsächlich, weil es möglich ist, in den Dateinamen nicht übliche Zeichen als Zeilenumbruch zu finden , die Registerkarte ... Hier funktioniert ein reiner Shell-Zyklus [ cuonglm ] .
Auch der find
Befehl verrohrt nicht mit der Option -exec
funktioniert:
find ./*.png -exec basename {} .png \;
Updates / Hinweise : Mit können Sie find .
auch nach versteckten Dateien suchen oder find ./*.png
nur nach nicht versteckten. Bei find *.png -exec ...
Ihnen kann es zu Problemen kommen, falls eine Datei mit dem Namen " .png
find" vorhanden war. Diese wird von find als Option abgerufen. Sie können hinzufügen -maxdepth 0
, um zu vermeiden, dass in Verzeichnissen mit dem Namen Dir_01.png
oder find ./*.png -prune -exec ...
wenn maxdepth nicht zulässig ist (danke Stéphane) , absteigend verfahren wird. Wenn Sie vermeiden möchten, diese Verzeichnisse aufzulisten, sollten Sie die Option hinzufügen -type f
(die auch andere Arten von nicht regulären Dateien ausschließt). Werfen Sie einen Blick auf, man
um ein umfassenderes Panorama über alle verfügbaren Optionen zu erhalten, und prüfen Sie, ob diese POSIX-kompatibel sind, um die Portabilität zu verbessern.
Noch ein paar Worte
Es kann beispielsweise vorkommen, dass beim Kopieren des Titels aus einem Dokument und Einfügen in den Dateinamen eine oder mehrere Zeilenvorschübe im Dateinamen selbst abgeschlossen werden. Wir können sogar so unglücklich sein, dass ein Titel sogar den Schlüssel enthalten kann, den wir kurz vor einer neuen Zeile verwenden müssen:
The new art of working on .png
files and other formats.
Wenn Sie testen möchten, können Sie mit den Befehlen solche Dateinamen erstellen
touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"
Das einfache /bin/ls *png
wird ?
anstelle der nicht druckbaren Zeichen ausgegeben
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
In allen Fällen, in denen Sie die Ausgabe von ls
oder find
den folgenden Befehl weiterleiten, gibt es keinen Hinweis darauf, ob die aktuelle Zeile aus einem neuen Dateinamen stammt oder einem Zeilenumbruchzeichen im vorhergehenden Dateinamen folgt . Ein böser Name, aber immer noch ein legaler.
Ein Shell-Zyklus mit einer Shell-Parameter-Erweiterung, ${parameter%word}
in beiden Varianten mit printf
oder echo
wird funktionieren [ cuonglm ], [ Anthon1 ] .
for f in *.png; do printf "%s\n" "${f%.png}" ; done
Aus der Manpage der Shell Parameter Expansion [ 3 ]
$ {parameter% word}
$ {parameter %% word}
... das Ergebnis der Erweiterung ist der Wert des Parameters, bei dem das kürzeste Übereinstimmungsmuster (der Fall '%') oder das längste Übereinstimmungsmuster (der Fall '%%') gelöscht wurde.
.
. Obwohl die Konvention besagt, dass Sie Ihre Dateien.png
am Ende mit einem Namen versehen sollen, gibt es keinen Grund, warum ich keine PNG-Datei mit dem Namenfoo.zip
odermy.picture.20160518
oder einfach haben kannmypic
.