Eu tinha vários arquivos de verificação do Windows, por exemplo Image.png
, Image (2).png
, ...
Image (19).png
.
Eu precisava renomeá-los Image01.png
...
Image19.png
para poder lançá-los em um imagemagick
comando convert para paginá-los em um PDF de saída.
Este foi o comando que acabei 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
Isso funcionou, mas há uma maneira mais concisa de fazer isso, que não envolve o uso de espaços reservados sujos/com bugs, como a inserção de 2
caracteres aleatórios para fazer a renomeação funcionar.
Responder1
rename 's/^Image\.png$/Image01.png/ || s/^Image\s+\((\d+)\)\.png$/sprintf "%s%02d.png", "Image", $1/e' *.png
Método
- O
rename
utilitário é o caminho a percorrer no seu cenário. Seu modelo de funcionamento é o seguinte: pega uma lista de nomes de arquivos e aplica umaPerl
transformação válida em cada nome de arquivo e o que sai da transformação se torna o novo nome do nome do arquivo. - s/^Image.png$/Image(01).png/ => isso é para lidar com o arquivo Image.png.
- s/^Image\s+((\d+)).png$/ => corresponde a um nome de arquivo começando com Image e, em seguida, qualquer quantidade de um ou mais espaços seguido por um colchete de abertura literal (e um ou mais dígitos \d+ e um colchete de fechamento ) e terminando com o .png.
Responder2
Como você sabe que os arquivos são chamados Image.png
e Image (2).png
embora to Image (19).png
, não há necessidade de expressões 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á uma versão inteira de dois caracteres preenchida com zero de $i
.