Ich hatte eine Menge Windows-Scan-Dateien, z. B. Image.png
, Image (2).png
, ...
Image (19).png
.
Ich musste diese umbenennen, Image01.png
...
Image19.png
damit ich sie dann in einen imagemagick
Konvertierungsbefehl 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 2
Zeichen, 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
rename
Dienstprogramm ist in Ihrem Szenario die richtige Wahl. Sein Arbeitsmodell ist das folgende: Es nimmt eine Liste von Dateinamen und wendetPerl
auf 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.png
und 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
$zi
wird eine mit Nullen aufgefüllte, zwei Zeichen breite Ganzzahlversion von sein $i
.