Wie kann ich die Größe von Bildern in mehreren Unterverzeichnissen effektiver ändern?

Wie kann ich die Größe von Bildern in mehreren Unterverzeichnissen effektiver ändern?

Ich habe die Originalbilder in einer Verzeichnisstruktur, die so aussieht:

./Alabama/1.jpg
./Alabama/2.jpg
./Alabama/3.jpg
./Alaska/1.jpg
...the rest of the states...

Ich wollte alle Originalbilder in Miniaturansichten umwandeln, damit ich sie auf einer Website anzeigen kann. Nach einigem Suchen und Experimentieren bin ich auf den folgenden Linux-Befehl gestoßen:

find . -type f -iname '*.jpg' | sed -e 's/\.jpg$//' | xargs -I Y convert Y.jpg -thumbnail x100\> Y-small.jpg

Es findet rekursiv alle JPG-Bilder in meinen Unterverzeichnissen, entfernt den Dateityp (.jpg) aus ihnen, damit ich sie später umbenennen kann, macht dann ein Miniaturbild daraus und benennt sie um, indem ich vor dem Dateityp „-small“ anhänge.

Für meine Zwecke hat es funktioniert, aber es ist ein bisschen kompliziert und nicht sehr robust. Ich bin mir beispielsweise nicht sicher, wie ich „small-“ am Anfang des Dateinamens einfügen würde (also ./Alabama/small-1.jpg).

Fragen:

  1. Gibt es eine bessere, robustere Möglichkeit, Miniaturansichten von Bildern zu erstellen, die sich in mehreren Unterverzeichnissen befinden?
  2. Kann ich den vorhandenen Befehl robuster machen (zum Beispiel indem ich sed verwende, um das ausgegebene Miniaturbild umzubenennen, bevor es gespeichert wird – also im Wesentlichen den Teil Y-small.jpg ändere)?

Antwort1

Wenn es sich immer nur eine Verzeichnisebene unter Ihrer Position befindet, können Sie eine Schleife wie folgt versuchen:

for dir in *; do
  [ ! -d "$dir" ] && continue; # skip non-directory entries, i.e. additional files
  cd "$dir"
  for file in *.jpg; do
    convert -thumbnail x100 "$file" "small-${file}" # creates e.g. small-1.jpg
  done
done

verwandte Informationen