Ich möchte ein Bash-Skript, das Folgendes ausführt:
- Suchen Sie Bilder (JPG, JPEG, JPG, JPEG) rekursiv vom aktuellen Verzeichnis abwärts
- Generieren Sie eine Miniaturansicht mit imagemagicks Konvertierung
- Verschieben Sie die Miniaturansicht in ein anderes Verzeichnis
Mein aktuelles Skript sieht folgendermaßen aus:
for f in `find . -type f -iname "*.jpg"`
do
convert ./"$f" -resize 800x800\> ./"${f%.jpg}_thumb.jpg"
mv ./"${f%.jpg}_thumb.jpg" /home/user/thumbs/
done
Es werden keine Dateien (oder Ordner mit allen Inhalten) konvertiert, die Leerzeichen / Sonderzeichen enthalten. Ich habe es versucht, print0
aber es hat nicht geholfen.
bash
find
imagemagick
thumbnails
LucaTony
quelle
quelle
find
die AusgabeAntworten:
Sie können erweiterte Optionen wie die
-set
Kombination mit prozentualen Escapezeichen verwenden (%t
um den Dateinamen ohne Verzeichnis oder Erweiterung zu extrahieren), um die Größe jeder Datei mit einem einzigenconvert
Aufruf zu ändern, umzubenennen und zu verschieben :quelle
Iterieren Sie nicht über die Ausgabe von
find
. Das Problem, das Sie haben, ist eine typische Folge davon.Ihr Beispiel ist aufgrund der Umbenennung der Datei etwas schwierig. Ein nicht sehr effizienter, aber sicherer Weg, dies zu tun, ist die
-exec
Optionfind
und eine zusätzlichesh
pro Datei, wie folgt :Wenn es Ihnen nichts ausmachen würde, denselben Namen zu verwenden (mit
.jpg
Suffix anstelle von_thumb.jpg
), würde dieses einfache Formular funktionieren und viel effizienter sein:Ich habe dort
echo
Anweisungen hinzugefügt , um die Ausgabe zu überprüfen, bevor die Befehle ausgeführt werden. Entfernen Sie sie, wenn die Ausgabe gut aussieht.quelle
In Ihrer Lösung wurden die Dateinamen auf die Standardeinstellung aufgeteilt,
$IFS
die Leerzeichen enthält.Versuche Folgendes:
Das
find
druckt die durch Nullbytes (\0
) getrennten Dateinamen und setzt mit-d ''
Ihnen das Trennzeichenread
auf das gleiche.quelle
-format
aber ich habe sie falsch verstanden. Es gibt auch,-set
aber ich verstehe seine Syntax nicht: imagemagick.org/Usage/files/#save_escapes Ich glaube nicht, dass ich mehr Zeit in diese investieren werde.find […] -exec mogrify […] {} +
aber anscheinend ist es aus einem anderen Grund eine schlechte Idee: "Alle drei Bilder [im Beispiel] werden jedoch in den Speicher eingelesen und dann mit dem einen Befehl geändert. Dies wird nicht empfohlen Lösung für eine Anzahl großer Bilder oder eine sehr große Anzahl von Bildern, da es möglich ist, Speichergrenzen zu erreichen und damit zum Austauschen (Thrashing) von Datenträgern zu gelangen. " (von dem Link in meinem vorherigen Kommentar). Vielleicht ist die Möglichkeit solcher Fälle auch etw. Erwähnenswert in Ihrem langen Übersichtsbeitrag.