При вводе
utility1 && utility2
это означает, что utility2
не запустится, пока utility1
не завершится с нулевым статусом выхода (, но не иначе ).
Аналогично,
utility1 || utility2
означает, что utility2
будет работать, если utility1
завершится с не -нулевым статусом выхода (, но не иначе ).
С
utility1 & utility2 &
то же, что и
utility1 &
utility2 &
вы запускаете обе утилиты как фоновые процессы (обе будут запускаться независимо друг от друга )и с
utility1 & utility2
, что совпадает с
utility1 &
utility2
вы запускаете utility1
как фоновый процесс, а затем utility2
как процесс переднего плана.
Это значит, случайно, что заголовок вашего вопроса угадан:
cmus & projectM-pulseaudio
или, возможно,
projectM-pulseaudio & cmus
(но я не знаю, что делают эти программы, поэтому я не уверен, имеет ли смысл запускать одну, другую или обе в качестве фонового процесса ).
Вы можете сделать две замены: одну для замены части после первой -
, а затем заменить все пробелы
rename -nv -- 's/-\s\w+[.]log$/.log/; s/\s+//g' *.log
Как только вы обнаружите, что замены соответствуют ожиданиям, снимите флаг -n
.
Команда 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 или более не--
символов, следующий за ним, который заканчивается .
и замените все это только .
. Мне нужно экранировать.
(\.
)с левой стороны, потому что .
означает «любой символ», когда он не экранирован. Это не проблема с правой стороны. сторона.
Предлагаю это:
rename 's/(filename - y.*) -.*(\.log)/$1$2/' *.log