У меня есть такой каталог:
randomized_quad015.png
randomized_quad030.png
randomized_quad045.png
randomized_quad060.png
randomized_quad075.png
randomized_quad090.png
randomized_quad1005.png
randomized_quad1020.png
randomized_quad1035.png
randomized_quad1050.png
randomized_quad105.png
randomized_quad1065.png
randomized_quad1080.png
randomized_quad1095.png
randomized_quad1110.png
randomized_quad1125.png
randomized_quad1140.png
, и я хочу переименовать первые файлы, добавив 0 перед номером, например:
randomized_quad0015.png
Но я не секрет производства. Некоторая помощь?
В качестве альтернативы различным Perl-основанным методам в других ответах, вы можете сделать этот конкретный пример и множество других аналогичных с простым bash
:
for i in randomized_quad???.png; do
mv $i randomized_quad0${i#randomized_quad}
done
Это зацикливает имена файлов. в области чисел всего три символа, а переменное выражение в фигурных скобках берет каждое имя файла, отсекает «randomized_quad» спереди (с помощью оператора #) и добавляет «randomized_quad0» спереди.
Другие удивительно полезные операторы, такие как это:
%
- что-то отрезать с конца /
- поиск и замена (/
для первого соответствия , //
для всех совпадений) :
- для извлечения подстрок Более полный список с примерами приведен здесь . Также обратите внимание, что они используют регулярные выражения в стиле POSIX, поэтому .
будет соответствовать любому символу, а не только «.» Если вы хотите сопоставить «.», Вы должны «убежать» с обратной косой чертой:
TestVariable1="filename.png"
TestVariable2="filename0png"
echo "${TestVariable1%.png}"
> filename
echo "${TestVariable2%.png}"
> filename
echo "${TestVariable1%\.png}"
> filename
echo "${TestVariable2%\.png}"
> filename0png
С последней версией удара Вы могли записать:
for f in randomized_quad*.png; do
if [[ $f =~ [1-9][0-9]* ]]; then
new=$(printf "randomized_quad%04d.png" ${BASH_REMATCH[0]})
[[ $f != $new ]] && mv -v $f $new
fi
done
rename
инструмент командной строки, который позволяет Вам переименовать файлы, с помощью команды Perl для преобразования имени. Команда Perl это является наиболее часто используемым при этом обстоятельстве, s/REGEXP/REPLACEMENT/
.
Если я интерпретирую Ваш вопрос правильно, Вы хотите добавить продвижение 0 на имена, которые имеют меньше чем 4 цифры, так, чтобы все имена закончили тем, что имели 4 цифры. Это немного сложное выражение обрабатывает общий случай, где у Вас есть имена файлов с 1, 2 или 3 цифры: это выравнивает всех их к 4 цифрам. e
модификатор в конце заставляет замену интерпретироваться не как строка, но как выражение Perl. Это выражение повторяет цифру 0
так же много раз по мере необходимости для заполнения числа к 4 цифрам.
rename 's/(?=([0-9]+)\.)/"0" x (4 - length($1))/e' *.png
Если файлы, Вы хотите переименовать всех, имеют три цифры, существуют более простые пути, такой как
rename 's/[0-9]+\./0$&/' *[!0-9][0-9][0-9][0-9].png
или
rename 's/(?<=[^0-9])[0-9]{3}\./0$&/' *.png
rename 's/quad([0-9]{3})\.png/quad0$1/' randomized_quad*