Четкое объяснение синтаксиса команды rename

Я должен быть очень тупым, потому что даже после прочтения человека для переименования и множества примеров сценариев, которые другие предоставили на разных досках объявлений, я все еще не могу даже понять, что на самом деле означает синтаксис команды rename.

Я пытаюсь изучить команды bash, и я понимаю, насколько опасно просто копировать & amp; запускать команды из Интернета, фактически не понимая, что и что более важно, почему они «делают то, что делают». Итак, может кто-то, пожалуйста, помогите мне понять, что означают условия для команды rename, чтобы я мог построить свой собственный рабочий & amp; точная команда?

Для специфики я загрузил более 40 видеороликов YouTube в один и тот же каталог, и все они заканчиваются на -fgrhegrvbfv (каждый из них имеет абсолютно случайные символы после -). Я просто хочу удалить - и 12 символов после него в каждом имени файла. Большое спасибо!

2
задан 4 May 2017 в 06:03

4 ответа

Первый параметр - это фрагмент Perl, который преобразует старое имя (в $_) в новое, а остальные параметры - это файлы, которые будут работать. В вашем случае вы сделаете следующее:

rename 's/-.{12}$//' *
1
ответ дан 18 July 2018 в 13:51

Вот один из способов сделать это:

$ ls file2-fdsa file-asdf $ prename -nv 's/(.*)-(.*)/$1/' *-* file-asdf renamed as file file2-fdsa renamed as file2

Как это работает, мы имеем две «группы» совпадающих символов. Итак, сначала (.*) будет тем, что есть до -, а второе (.*) будет тем, что после -. Мы можем ссылаться на них через $1 для групп 1 и $2 для группы 2 (которая не используется).

*-* сообщает оболочке принимать все файлы с - в ней и передавать их в качестве аргументов в команду rename. Эта часть не имеет ничего общего с rename, но с оболочкой. Это просто делает нашу жизнь немного легче.

Теперь вся команда может быть прочитана: «Возьмите все файлы, которые имеют - в них, и для каждого имени файла разбивайте его на две группы и переименуйте этот файл только в том, что находится в первой группе "

Обратите внимание на пару вещей:

флаг -n используется только для сухого хода. Удалите этот флаг, который вы хотите выполнить на самом деле. флаг -v используется для получения подробного вывода того, что prename действительно делает prename, таким же, как rename. Там только немного беспорядка с debian пакетов и что поддерживается. См. Это для получения дополнительной информации. Обратите внимание, что некоторые оболочки, такие как ksh, имеют собственную встроенную команду rename, которая отличается от переименования perl.
0
ответ дан 18 July 2018 в 13:51

Первый параметр - это фрагмент Perl, который преобразует старое имя (в $_) в новое, а остальные параметры - это файлы, которые будут работать. В вашем случае вы сделаете следующее:

rename 's/-.{12}$//' *
1
ответ дан 24 July 2018 в 20:16
  • 1
    Спасибо, Джозеф. Поэтому я могу сказать, что "s /" и "$ //" постоянны в каждом примере, который я видел в Интернете, и я предполагаю, что & quot; & quot; & quot; в конце просто говорит ему сделать это ко всем файлам в текущем каталоге. И я также предполагаю, что "{12}" равно числу символов, которые я хочу удалить. Тем не менее, я до сих пор не знаю, что такое «...». означает, и когда я запустил ваш пример, он изменил только один файл. О, и я также заметил, что некоторые из моих файлов имеют тире & quot; - & quot; в течение последних 12 символов. Мне жаль, что я так незнаю, но я никогда не изучал программирование (не говоря уже о perl). Спасибо – Turp 4 May 2017 в 05:58
  • 2
    S / stuff - это замена регулярного выражения. Синтаксис: s/regex/replacement/. Регулярное выражение, которое я вам дал, -.{12}$, означает совпадение тире, затем 12 из ничего (технически, ничего, кроме символов новой строки), а затем конец. Поскольку ничего не происходит с заменой, он просто удаляет соответствующую часть, не заменяя ее чем-либо. Вы уверены, что ровно 12 символов после тире в каждом из них? – Joseph Sible 4 May 2017 в 06:08

Вот один из способов сделать это:

$ ls file2-fdsa file-asdf $ prename -nv 's/(.*)-(.*)/$1/' *-* file-asdf renamed as file file2-fdsa renamed as file2

Как это работает, мы имеем две «группы» совпадающих символов. Итак, сначала (.*) будет тем, что есть до -, а второе (.*) будет тем, что после -. Мы можем ссылаться на них через $1 для групп 1 и $2 для группы 2 (которая не используется).

*-* сообщает оболочке принимать все файлы с - в ней и передавать их в качестве аргументов в команду rename. Эта часть не имеет ничего общего с rename, но с оболочкой. Это просто делает нашу жизнь немного легче.

Теперь вся команда может быть прочитана: «Возьмите все файлы, которые имеют - в них, и для каждого имени файла разбивайте его на две группы и переименуйте этот файл только в том, что находится в первой группе "

Обратите внимание на пару вещей:

флаг -n используется только для сухого хода. Удалите этот флаг, который вы хотите выполнить на самом деле. флаг -v используется для получения подробного вывода того, что prename действительно делает prename, таким же, как rename. Там только немного беспорядка с debian пакетов и что поддерживается. См. Это для получения дополнительной информации. Обратите внимание, что некоторые оболочки, такие как ksh, имеют собственную встроенную команду rename, которая отличается от переименования perl.
0
ответ дан 24 July 2018 в 20:16
  • 1
    Это прекрасно, теперь я понимаю! Теперь я могу поиграть с ним и выяснить, как его манипулировать. Я знаю, я только что купил Unix и Linux Administrator's Handbook (4-е издание), и хотя он охватывает выражения Perl (всего на 2 страницах), он даже не упоминает «переименовать & quot; вообще! – Turp 5 May 2017 в 05:06
  • 2
    @Turp Да, в мире Linux и Unix так много утилит, что трудно охватить каждый из них, но rename очень полезен и часто рекомендуется. Я бы посоветовал вам сосредоточиться на изучении регулярных выражений вообще и, более конкретно, регулярного выражения perl-стиля, поскольку вы уже имеете дело с ним. Это сделает вашу жизнь намного легче, и вы можете иметь дело с rename. Потому что это то, о чем идет речь - это регулярные выражения, и этот синтаксис не специфичен для команды rename. – Sergiy Kolodyazhnyy 5 May 2017 в 05:25

Другие вопросы по тегам:

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