Bash - renomear arquivos 'Image (x) .png'

1

Eu tinha um monte de arquivos de verificação do Windows, por exemplo Image.png , Image (2).png , ... Image (19).png .

Eu precisava renomeá-los para Image01.png ... Image19.png para poder jogá-los em um comando imagemagick convert para paginar em ordem 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]\)//' | sed -e 's/2Image.png2/Image01.png/' | sh

Isso funcionou, mas há uma maneira muito mais concisa de fazê-lo, que não envolve o uso de espaços reservados com bugs / sujos, como a inserção de caracteres 2 aleatórios para que a renomeação funcione.

    
por user326608 27.04.2017 / 06:27

2 respostas

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

Método

  • O utilitário rename é o caminho a percorrer no seu cenário. O modelo de trabalho é o seguinte: pega uma lista de nomes de arquivos e aplica uma transformação Perl 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 / ^ Imagem \ s + ((\ d +)). png $ / = > corresponde a um nome de arquivo que começa com Image e, em seguida, qualquer quantidade de um ou mais espaços seguidos por um colchete de abertura literal (e um ou mais dígitos \ d + e um colchete de fechamento) e termina com o .png.
por 27.04.2017 / 06:49
2

Como você sabe que os arquivos são chamados de Image.png e Image (2).png para 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 com largura de zero de $i .

    
por 27.04.2017 / 08:33

Tags