Переименовать, чтобы удалить все после специального символа

При вводе

utility1 && utility2

это означает, что utility2не запустится, пока utility1не завершится с нулевым статусом выхода (, но не иначе ).

Аналогично,

utility1 || utility2

означает, что utility2будет работать, если utility1завершится с не -нулевым статусом выхода (, но не иначе ).

С

utility1 & utility2 &

то же, что и

utility1 &
utility2 &

вы запускаете обе утилиты как фоновые процессы (обе будут запускаться независимо друг от друга )и с

utility1 & utility2

, что совпадает с

utility1 &
utility2

вы запускаете utility1как фоновый процесс, а затем utility2как процесс переднего плана.

Это значит, случайно, что заголовок вашего вопроса угадан:

cmus & projectM-pulseaudio

или, возможно,

projectM-pulseaudio & cmus

(но я не знаю, что делают эти программы, поэтому я не уверен, имеет ли смысл запускать одну, другую или обе в качестве фонового процесса ).

3
21.08.2019, 20:42
3 ответа

Вы можете сделать две замены: одну для замены части после первой -, а затем заменить все пробелы

rename -nv -- 's/-\s\w+[.]log$/.log/; s/\s+//g' *.log

Как только вы обнаружите, что замены соответствуют ожиданиям, снимите флаг -n.

1
27.01.2020, 21:17

Команда 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 или более не--символов, следующий за ним, который заканчивается .и замените все это только .. Мне нужно экранировать.(\.)с левой стороны, потому что .означает «любой символ», когда он не экранирован. Это не проблема с правой стороны. сторона.

3
27.01.2020, 21:17

Предлагаю это:

rename 's/(filename - y.*) -.*(\.log)/$1$2/' *.log
0
27.01.2020, 21:17

Теги

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