Dies kann auch mit xargs
erfolgen und sed
um die Dateierweiterung zu ändern.
ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv
Sie können den ursprünglichen Dateinamen zusammen mit dem gewünschten Dateinamen drucken. Lassen Sie dann xargs diese beiden Argumente im Bewegungsbefehl verwenden. Für den Einzeiler habe ich auch ein grep hinzugefügt, um alles herauszufiltern, was keine *.png-Datei ist.
Wie benenne ich die Datei um, sodass ich nur eine Erweiterung haben kann.
cd dir/with/messedup/files
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
Wie ändere ich in Zukunft mit xargs die Erweiterung der Datei ähnlich dem zweiten Befehl?
Das geht meines Wissens nach nicht. Der beste Weg, dies zu tun, wäre die Verwendung einer for-Schleife mit Parameterersetzung ähnlich der obigen:
for file in *.png; do
convert "$file" -resize "${file%.png}.jpg"
done
Wenn Sie Dateien in Unterverzeichnissen haben, die Sie konvertieren möchten, können Sie find
leiten zu einem while read
Schleife:
find . -type f -name '*.png' |
while read file; do
convert "$file" -resize "${file%.png}.jpg"
done
HINWEIS: Es wird allgemein als schlechte Idee angesehen, die Ausgabe von ls
zu verwenden in einem Shell-Skript. Während Ihr Beispiel möglicherweise gut funktioniert hat, gibt es viele Beispiele, bei denen dies nicht der Fall ist. Wenn Ihre Dateinamen beispielsweise Zeilenumbrüche enthalten (was Unix zulässt), ls
werden denen wahrscheinlich nicht entkommen. (Das hängt tatsächlich von Ihrer Implementierung ab, was ein weiterer Grund ist, ls
nicht zu verwenden in Skripten; sein Verhalten variiert stark von einer Box zur nächsten.) Sie erhalten konsistentere Ergebnisse, wenn Sie entweder find
verwenden in einer While-Read-Schleife oder Dateiglobbing (z.B. *.png
) in einer for-Schleife.