Ich verwende das folgende Skript, um alle jpg
Bilder zu konvertieren png
:
# absolute path to image folder
FOLDER="/home/*/public_html/"
# max width
WIDTH=1280
# max height
HEIGHT=720
#resize png or jpg to either height or width, keeps proportions using imagemagick
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
aber ich war heute schockiert, als ich lief
ls -l
und fand alle Fotos modifiziert, Daten geändert, groß oder nicht
Oct 28 11:18 /home/photos/20210321/T161631305496ece25372fc18a9239da7911ac7c0dd056 (2).jpg
Ich denke also darüber nach, eine if
Bedingung zu verwenden, um zuerst den Pfad des Bildes zu prüfen und dann, wenn WIDTH größer als 1280px ist, „auszuführen“ convert
. Sonst nichts tun.
Aktualisierung 2
Ich habe dieses Skript erstellt
#!/bin/bash
for i in /root/d/*.jpg; do
read -r w h <<< $(identify -format "%w %h" "$i")
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
fi
done
So kann ich find
besser sehen for
.
for
Es wurden nicht alle Ordner und Unterordner durchsucht.
Aktualisierung 3
WIDTH=1280
HEIGHT=720
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read img; do \
anytopnm "$img" | pamfile | \
perl -ane 'exit 1 if $F[3]>1280' || convert "$img" -verbose -resize "${WIDTH}x${HEIGHT}>" "$img"; \
done
es funktioniert gut, aber ich bekomme
jpegtopnm: WRITING PPM FILE
wenn keine Bilder> 1280
Antwort1
Das Hauptproblem mit Ihrem convert
Befehl besteht darin, dass das Argument $WIDTHx$HEIGHT\>
versucht, eine Variable namens zu erweitern $WIDTHx
. Da diese Variable nicht existiert, -resize
wird als Argument einfach das verwendet, was $HEIGHT\>
ist (was dasselbe ist wie die Verwendung von "${HEIGHT}x$HEIGHT>"
). Sie beheben dies, indem Sie verwenden -resize "${WIDTH}x$HEIGHT>"
. Dies ist ein Problem in beiden Ihrer find
Befehle.
Um Ihre zu großen Bilder zu verkleinern, könnten Sie möglicherweise etwas wie verwenden
#!/bin/sh
w=1280
h=720
find /home/*/public_html -type f \( -iname '*.jpg' -o -name '*.png' \) \
-exec convert -resize "${w}x${h}>" {} \;
Persönlich würde ich einfach die Bilder aus der letzten Sicherung wiederherstellen, da ein derartiges Hoch- und Herunterskalieren der Bilder zwangsläufig zu einer drastischen Reduzierung ihrer Qualität führt.
Führen Sie beim Ausprobieren zunächst kleinere Kopien Ihrer Bilder aus, bevor Sie Ihre Skripte auf Ihre gesamte Bildersammlung loslassen. Stellen Sie außerdem sicher, dass Ihre Backups wie erwartet ausgeführt werden.
Antwort2
Es tut mir so leid, dass ich mich nicht klar ausgedrückt habe. Ich habe mein endgültiges Skript gefunden und erstellt und hoffe, den Titel von Q durch einen cleveren zu korrigieren.
Skriptsuche nach Dateien jpg
oder png
und wenn gefunden überprüfen Breite wenn gefunden größer als 1280 wird konvertieren
#!/bin/bash
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read i; do \
read -r w h <<<$(identify -format "%w %h" "$i")
if [ $w ]; then
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize ${WIDTH}x${HEIGHT}\> \{} \;
fi
fi
done