Команда perl-rename
просто использует регулярное выражение. Поскольку это Perl, он использует очень мощный Perl-совместимый язык регулярных выражений (PCREs ). Поэтому, если вы хотите узнать, как его использовать, просто найдите PCRE.
В этом случае похоже, что вы хотите удалить все пробелы из имен файлов, а также удалить строку -extra
. Вы можете использовать две операции, просто разделите их;
:
$ rename -n 's/ //g; s/-extra//' *.log
filename - y01m01 - extra.log -> filename-y01m01.log
filename - y01m02 - extra.log -> filename-y01m02.log
filename - y01m03 - extra.log -> filename-y01m03.log
filename - y05m12 - extra.log -> filename-y05m12.log
s/ //g
означает "заменить все пробелы ничем" (поэтому удалите все пробелы ). По умолчанию используемый здесь оператор замены(s/old/new/options
)заменяет только первое совпадение. Чтобы он заменял все совпадения, вам нужна «глобальная» опция (g
). Вот почему в s/ //g
есть g
.
s/-extra//
просто означает «заменить первое совпадение для -extra
ничем».
Если это делает то, что вы хотите, запустите его снова, но без -n
. Это заставляет rename
просто распечатать то, что он будет делать, не делая этого на самом деле. Очень полезно для тестирования!
Если -extra
не является статической строкой, но может изменяться. Вместо этого вы можете удалить все после последнего -
и до следующего.
:
$ rename -n 's/ //g; s/-[^-]*\././' *.log
filename - y01m01 - extra.log -> filename-y01m01.log
filename - y01m02 - extra.log -> filename-y01m02.log
filename - y01m03 - extra.log -> filename-y01m03.log
filename - y05m12 - extra.log -> filename-y05m12.log
Здесь s/ //g
удалит все пробелы, как и раньше, а s/-[^-]*\././
означает «найти -
, а затем самый длинный отрезок из 0 или более не--
символов, следующий за ним, который заканчивается .
и замените все это только .
. Мне нужно экранировать.
(\.
)с левой стороны, потому что .
означает «любой символ», когда он не экранирован. Это не проблема с правой стороны. сторона.