Bash - переименовать файлы «Image (x).png»

Bash - переименовать файлы «Image (x).png»

У меня была куча файлов сканирования Windows, например Image.png, Image (2).png, , ... Image (19).png.

Мне нужно было переименовать их в , Image01.png ... Image19.pngчтобы затем можно было передать их imagemagickкоманде convert для разбиения по страницам в выходном PDF-файле.

Вот команда, которую я в итоге использовал:

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

Это сработало, но есть более лаконичный способ сделать это, не требующий использования грязных/глючных заполнителей, таких как вставка случайных 2символов, чтобы переименование сработало.

решение1

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

Метод

  • Утилита rename— это путь в вашем сценарии. Ее рабочая модель следующая: берет список имен файлов и применяет допустимое Perlпреобразование к каждому имени файла, и то, что получается в результате преобразования, становится новым именем имени файла.
  • s/^Image.png$/Image(01).png/ => это для работы с файлом Image.png.
  • s/^Image\s+((\d+)).png$/ => соответствует имени файла, начинающемуся с Image, затем любому количеству пробелов, за которыми следует буквальная открывающая скобка (и одна или несколько цифр \d+ и закрывающая скобка), и заканчивающемуся расширением .png.

решение2

Поскольку вы знаете, что файлы называются Image.pngи Image (2).pngхотя Image (19).png, нет необходимости в регулярных выражениях:

mv Image.png Image01.png
for i in {2..19}; do
    zi=$( printf '%02d' "$i" )
    mv "Image ($i).png" "Image$zi.png"
done

$ziбудет представлять собой заполненную нулями версию целого числа длиной в два символа $i.

Связанный контент