Wie verwende ich „convert“ und „xargs“ zusammen?

Wie verwende ich „convert“ und „xargs“ zusammen?

Ich muss eine Reihe von .rgbDateien in .pngs konvertieren (jede Datei sollte ihren ursprünglichen Namen behalten).

Ich möchte herausfinden, wie ich die erste Datei konvertiere und den Befehl dann in eine For-Schleife einschließe.

Das habe ich bisher:

find . -name "*.rgb" | sort | sed -n \1\p | xargs convert zzzzz.png

Aber das funktioniert nicht.

Wie kann ich dafür sorgen, convertdass der Befehl das zweite Argument erkennt zzzzz.png?

Antwort1

Wenn Sie alle Dateien im Verzeichnisbaum konvertieren möchten, würde ich Folgendes ausführen:

find . -name '*.rgb' | parallel convert {} {.}.png

Dies wird parallel ausgeführt:

convert ./foo.rgb ./foo.png
convert ./bar/quux.rgb ./bar/quux.png

Hier verwende ich GNU Parallel, um alle CPUs zu nutzen. Abhängig von Ihrem System können Sie es als Paket installieren, andernfalls ist es hiergnu.org/software/parallel. In Debian ist es:

apt-get install parallel

Bearbeiten:
Hier ist eine Lösung ohne GNU Parallel:

find . -name '*.rgb' -exec sh -c 'convert "$0" "${0%.*}.png"' {} \;

und eine nicht so schöne Lösung mit while..read:

find . -name '*.rgb' | while read FILE; do convert "${FILE}" "${FILE%rgb}png" ; done

Antwort2

Um alle Bilder in einem einzigen Verzeichnis zu konvertieren (in meinem Fall die Größe zu ändern), verwende ich

ls *.jpg | xargs -I {} convert {} -resize 1024x768 resized/{}

Bitte beachten Sie, dass der Platzhalter für geschweifte Klammern im Dateinamen zweimal verwendet werden kann. Sie können ihn auch verwenden, um dem Zieldateinamen ein Präfix hinzuzufügen.

Für die rekursive Suche:

find -name '*.jpg' | xargs -I {} convert {} -resize 1024x768 resized/{}

Antwort3

Ich habe die Antwort gefunden:

for i in 'seq 1 $numOfRGBfiles'; do
#Insert code here that finds the file
#name of each rgb file and stores it 
#in $filename.

'find . -name "*.rgb" | sort | sed -n 
\$i\p |  xargs -I {} convert {} 
\$filename.png'
done

verwandte Informationen