Утро,
В текущем проекте, над которым я должен работать, была предыдущая схема именования, которая беспокоит меня ...
Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h
Мне сказали, что «а» в версии заключалось в том, чтобы идентифицировать «альфа» версии, которые требовали дополнительной работы. На этом этапе проекта я могу удалить «а» и заменить его на «.1» (v2a -> v2.1).
Есть много файлов, помимо того, что я готов сделать вручную.
Я знаю, что могу использовать команду переименования, чтобы переименовать все файлы одновременно, но я сталкиваюсь с проблемой, как это сделать. Если я использую что-то вроде:
rename 's/[0-9]a/.1/' *
, тогда я потеряю последнюю цифру номера версии. Есть ли способ, чтобы переименовать (или другой инструмент командной строки) запомнить часть регулярного выражения, используемого для поиска файла? Таким образом, от '[0-9] a' до '[0-9] .1' изменится с 1a на 1,1, с 4a на 4.1 и т. Д.
Вы можете использовать группы захвата :
$ rename -n 's/(\d)a/$1.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h
Или вы можете использовать lookbehind :
$ rename -n 's/(?<=\d)a/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h
Или аналогично вкратце, утверждение длины 0 \K
, что означает «забыть все подходящее до этой точки»:
$ rename -n 's/\d\Ka/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h
Обратите внимание, что я использовал более короткое \d
вместо [0-9]
. Эти два варианта эквивалентны, но rename
является сценарием perl, поэтому понимает синтаксис регулярных выражений, совместимых с Perl (PCRE).
Обратите внимание, что это только изменит первое вхождение числа, за которым следует a
. Это может или не может быть то, что вам нужно, в зависимости от ваших имен файлов.
-n
заставляет rename
показать, что он будет делать, фактически ничего не делая. Как только вы подтвердите, что он работает как положено, удалите его, чтобы фактически изменить имена файлов.
Измените команду следующим образом:
rename 's/([0-9])a/$1.1/' *
s/<souce>/<replacement>/
заменит исходную строку (которая может быть регулярным выражением) замещающей строкой. (regexp)
, (string)
и т. Д., Будут назначены в качестве значений последовательных переменных: $1
, $2
и т. Д. $1
будет расширена со своим значением, которое в этом случае должно совпадать с регулярным выражением [0-9]
.