Bash - 'Image (x).png'-Dateien umbenennen

Bash - 'Image (x).png'-Dateien umbenennen

Ich hatte eine Menge Windows-Scan-Dateien, z. B. Image.png, Image (2).png, ... Image (19).png.

Ich musste diese umbenennen, Image01.png ... Image19.pngdamit ich sie dann in einen imagemagickKonvertierungsbefehl einfügen konnte, um sie der Reihe nach in ein Ausgabe-PDF zu paginieren.

Dies war der Befehl, den ich letztendlich verwendet habe:

ls * | awk '{print "mv \""$0"\" \"2"$0"2\"" }' | sed -e 's/2Image (/Image0/' | sed -e 's/).png2/.png/' | sed -e 's/[0-9]\([0-9][0-9]\)/\1/' | sed -e 's/2Image.png2/Image01.png/' | sh

Dies hat funktioniert, es muss jedoch eine prägnantere Möglichkeit geben, dies zu erreichen, bei der keine fehlerhaften Platzhalter verwendet werden, wie etwa das Einfügen von zufälligen 2Zeichen, damit die Umbenennung funktioniert.

Antwort1

rename 's/^Image\.png$/Image01.png/ || s/^Image\s+\((\d+)\)\.png$/sprintf "%s%02d.png", "Image", $1/e' *.png

Methode

  • Das renameDienstprogramm ist in Ihrem Szenario die richtige Wahl. Sein Arbeitsmodell ist das folgende: Es nimmt eine Liste von Dateinamen und wendet Perlauf jeden Dateinamen eine gültige Transformation an. Das Ergebnis der Transformation wird zum neuen Namen des Dateinamens.
  • s/^Image.png$/Image(01).png/ => dies dient zum Bearbeiten der Datei Image.png.
  • s/^Image\s+((\d+)).png$/ => passt zu einem Dateinamen, der mit „Image“ beginnt, dann folgt eine beliebige Anzahl von einem oder mehreren Leerzeichen, gefolgt von einer öffnenden Klammer (und einer oder mehreren Ziffern \d+ und einer schließenden Klammer) und endet mit .png.

Antwort2

Da Sie wissen, dass die Dateien aufgerufen werden Image.pngund Image (2).pngübergeben werden müssen Image (19).png, sind reguläre Ausdrücke nicht erforderlich:

mv Image.png Image01.png
for i in {2..19}; do
    zi=$( printf '%02d' "$i" )
    mv "Image ($i).png" "Image$zi.png"
done

$ziwird eine mit Nullen aufgefüllte, zwei Zeichen breite Ganzzahlversion von sein $i.

verwandte Informationen