У Вас почти был он. Просто необходимо сделать литеральные строки и конкатенацию строк явными в /e
- измененная замена, с помощью кавычек и точечного оператора.
rename 's/0([2-4])([\s\S]+)/"0".($1+1).$2/e' *
предпочтенная острота, не намереваясь записать целый автономный сценарий только для этого
Когда вещи становятся настолько сложными, я не вижу оснований для не записи сценария. Вы никогда не собираетесь помнить, как сделать это от одного выполнения до следующего, таким образом, Вы собираетесь закончить или переосмысление его каждый раз или оборачивание его в сценарии так или иначе.
Для мелочи как это я обычно начинаю пытаться решить его в Bash:
#!/bin/bash
if [ -z "$1" ] ; then echo Need arguments. ; exit 1 ; fi
typeset -i i=1
for f in "$*"
do
tailbits=`echo "$f" | sed -e 's/^[0-9]+//'`
mv "$f" sertmp-`printf %02d $i`"$tailbits"
i=i+1
done
for f in "sertmp-*"
do
mv "$f" `echo "$f" | sed -e s/^sertmp-//`
done
В основном этот сценарий снимает изоляцию с любых ведущих цифр, затем помещает дополненное нулем порядковое число увеличения на переднюю сторону с файлами, пронумерованными согласно порядку, Вы передаете их сценарию.
Это делает это на двух этапах, с sertmp-
префиксы для первичной обработки для предотвращения любого риска коллизий имени. Если Вы называете этот сценарий mp3-renamer
и назовите его как:
$ mp3-renamer 01-foo.mp3 03-bar.mp3 04-qux.mp3
Вы сталкиваетесь с тривиальной коллизией на первом, переименовывают, если Вы не используете 2 передачи, чтобы сделать переименование. (01-foo.mp3
-> 01-foo.mp3
.)
Если Вы называете его как это, хотя:
$ mp3-renamer 02-foo.mp3 01-foo.mp3
Вы случайно стираетесь 01-foo.mp3
в первом переименовывают с 1 передачей, переименовывают.
Если бы проблема становится более сложной, я переписал бы ее в Perl. В той точке Вы могли затем использовать хеш, чтобы содержать старое-> новое отображение имени и использовать немного умного кода для разработки надлежащего порядка сделать переименования для предотвращения потребности в 2 передачах.
$'\x01'2
затем предварительное переименование как это:prename 's/^05/\x012/' 05*
.. затем вышеупомянутое[2-4]
переименовать.. затем финалprename 's/^\x01/0/' $'\x01'2*
добьется цели.. Это делает 3 остроты... Для одной четверти и начальной проверки на возможное присутствие файла, запускающегося с$'\x01'
, что-то вроде этого колотит отрывок, захватит его..shopt -s nullglob; x=($'\x01'*); [[ -n $x ]] && { echo '\x01' is not suitable; exit; }
– Peter.O 03.09.2012, 12:13