Как переименовать файлы с подсчетом?

У меня есть такой каталог:

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

Но я не секрет производства. Некоторая помощь?

5
задан 26 December 2012 в 22:39

4 ответа

В качестве альтернативы различным 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
0
ответ дан 26 December 2012 в 22:39

С последней версией удара Вы могли записать:

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
0
ответ дан 26 December 2012 в 22:39

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
6
ответ дан 26 December 2012 в 22:39
rename 's/quad([0-9]{3})\.png/quad0$1/' randomized_quad*
0
ответ дан 26 December 2012 в 22:39

Другие вопросы по тегам:

Похожие вопросы: