Bash: cambie el nombre de los archivos 'Imagen (x).png'

Bash: cambie el nombre de los archivos 'Imagen (x).png'

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.pngpara poder lanzarlos con un imagemagickcomando 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 2caracteres 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 renameutilidad es el camino a seguir en su escenario. Su modelo de trabajo es el siguiente: toma una lista de nombres de archivos y aplica una Perltransformació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.pngy Image (2).pngpiensan 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

$ziserá una versión entera de dos caracteres de ancho llena de ceros $i.

información relacionada