Frage

Ich suche nach einer Lösung, die eine Reihe von Dateien mit dem Terminal und den Befehl „convert“ unter Linux zu konvertieren. Ich kann „konvertieren“ für jede Datei:

convert -quality 85 file.jpg file.jpg

Aber ich bin auf der Suche nach so etwas wie:

for each jpg do
  convert -quality 85 $file $file
end

Kann mir jemand sagen, welchen Befehl kann ich nutzen?

War es hilfreich?

Lösung

for i in *.jpg; do
   convert ... $i $i
done

sollte es tun. Das wird für sh / bash / zsh arbeiten usw. Es wird davon ausgegangen, dass alle Ihre * .jpg-Dateien im aktuellen Verzeichnis befinden. Andernfalls ersetzen * .jpg mit einem entsprechenden Entdeckung Aufruf z.

for i in `find . -name "*.jpg" -print`; do

Beachten Sie die Backticks. Diese zeigen an, dass der umschlossene Befehl ausgeführt werden sollte, und die Ergebnisse an die aufrufende Struktur zurückgeführt (in diesem Fall die for-Schleife)

Wenn Sie mit zsh , dann können Sie tun,

for i in **/*.jpg; do

Unterverzeichnisse in Ihrem Wildcard zu suchen, und qualifizieren, diese weiter mit fortgeschrittene zsh Wildcard-Syntax . Ich bin mir nicht sicher, welche Einrichtungen bash in diesem Bereich bietet jedoch.

Andere Tipps

Statt jede Datei von converting selbst zu überschreiben, können Sie seine Schwester Befehl mogrify verwenden, dass die Datei im Ort bearbeitet. Außerdem haben beiden Befehle eingebaut in Globbing, so können sie alle Bilder in einem einzigen Aufruf ändern, das ist schneller als das Programm einmal ausgeführt wird pro Bild. Siehe ImageMagick Befehlszeilenverarbeitung für weitere Informationen .

So wird dies tun:

mogrify '*.jpg' -quality 85

Wenn Sie Bash verwenden, Sie so etwas wie das folgende tun könnte:

$ for f in `ls path/to/jpegs/*.jpg`; do convert -quality 85 $f $f; done

Das wird eine Schleife durch alle JPEGs in einem bestimmten Verzeichnis und wandeln sie.

Wenn Sie nicht Bash verwenden, kann die Shell hat eine ähnliche for-Schleife Syntax; überprüfen Sie die man-Seiten.

Wenn Sie einen Multi-Core-Rechner haben, können Sie einige echte Geschwindigkeit erhalten, indem sie parallel zu tun:

mkdir -p converted
find -iname '*.jpg' -print0 | xargs -0 -P<number of cores> -n1 -Ifoo convert -quality 85 foo converted/foo

Ich würde ein Shell-Skript schreiben. Wenn your'e nicht vertraut mit der Shell-Programmierung finden Sie unter dieser Seite .

#!/bin/sh

for arg in `ls *.jpg`
do
    convert -quality 85 $arg $arg
done

Was ist? :

find [-maxdepth 1] -iname "*.jpg" -exec mogrify -quality 85 {} \;
  • optional -maxdepth 1 auf aktuelles Verzeichnis arbeiten nur (kein subdir.)
  • ImageMagick kommt mit mogrify, die Dateien an ihrem Platz ändert.
find . -name '*.jpg' -exec convert -quality 85 {} {} \;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top