it-swarm.com.de

Führen Sie den Befehl rekursiv in Unterverzeichnissen aus

Ich versuche, eine Reihe von Bildern in Miniaturansichten zu konvertieren, die sich möglicherweise in mehreren Unterverzeichnissen befinden, und speichere eine Kopie des Bildes als Miniaturansicht im Unterverzeichnis, aber ich kann die Syntax nicht herausfinden. Jeder Rat wäre willkommen.

convert test/*/*.jpg -50x50 test/*/*_thumb.jpg
4
Rilcon42

Sie sollten find verwenden, um alle benötigten Dateien zu finden.

find test -iname *.jpg -exec convert {} -resize 50x50 {}_thumb \;

Und dann sollten Sie Dateien mit dem Namen * .jpg_thumb in * _thumb.jpg umbenennen, indem Sie Folgendes verwenden:

find -name *.jpg_thumb -exec rename -e 's/^(.*)(.jpg)(_thumb)$/\1\3\2/' '{}' \;

Beachten Sie, dass -50x50 kein zulässiger Parameter für die Konvertierung ist. Sie sollten den Parameter -resize mit dem Wert 50x50 wie im obigen Beispiel verwenden.

4
Kamil

Eine Shell-Schleife sollte auch Folgendes tun:

for file in test/*/*.jpg ; do
    new=${file%.jpg}_thumb.jpg 
    convert "$file" -resize 50x50 "$new"
done

Oder mit Bashs globstar, was besser ist, wenn sich die Dateien auf beliebigen Verzeichnisebenen befinden können:

shopt -s globstar
for file in test/**/*.jpg ; do ...

${file%.jpg} nimmt den Wert der Variablen file und entfernt den String .jpg am Ende. (siehe BashGuide zu Parametererweiterungen )

3
ilkkachu