У меня была куча файлов сканирования 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
.