
Ich muss eine Reihe von .rgb
Dateien in .png
s 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, convert
dass 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