Tenía un montón de archivos de escaneo de Windows, por ejemplo Image.png
, Image (2).png
, ...
Image (19).png
.
Necesitaba cambiarles el nombre Image01.png
...
Image19.png
para poder lanzarlos con un imagemagick
comando de conversión para paginarlos en orden en un pdf de salida.
Este fue el comando que terminé usando:
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
Esto funcionó, pero hay una forma más concisa de hacerlo, que no implica el uso de marcadores de posición sucios o con errores, como insertar 2
caracteres aleatorios para que el cambio de nombre funcione.
Respuesta1
rename 's/^Image\.png$/Image01.png/ || s/^Image\s+\((\d+)\)\.png$/sprintf "%s%02d.png", "Image", $1/e' *.png
Método
- La
rename
utilidad es el camino a seguir en su escenario. Su modelo de trabajo es el siguiente: toma una lista de nombres de archivos y aplica unaPerl
transformación válida en cada nombre de archivo y lo que sale de la transformación se convierte en el nuevo nombre del archivo. - s/^Image.png$/Image(01).png/ => esto es para abordar el archivo Image.png.
- s/^Image\s+((\d+)).png$/ => coincide con un nombre de archivo que comienza con Imagen y luego cualquier cantidad de uno o más espacios seguido de un corchete de apertura literal (y uno o más dígitos \d+ y un corchete de cierre ) y terminando con el .png.
Respuesta2
Como sabes que los archivos se llaman Image.png
y Image (2).png
piensan Image (19).png
, no hay necesidad de expresiones regulares:
mv Image.png Image01.png
for i in {2..19}; do
zi=$( printf '%02d' "$i" )
mv "Image ($i).png" "Image$zi.png"
done
$zi
será una versión entera de dos caracteres de ancho llena de ceros $i
.