1

Я хочу переименовать несколько файлов с помощью командной строки, удалив шаблон из имени файла, сохранив остальные.

Исходный вывод:

$ ls
Versailles - Holy Grail (2011)
Versailles - Jubilee (2010)
Versailles - Noble (2008)

Желаемый вывод после команды:

$ ls
Holy Grail (2011)
Jubilee (2010)
Noble (2008)

1 ответ1

2

удар

С чистым Bash, удаляя все до первого -:

for f in *; do mv -- "$f" "${f#*- }"; done

Если вы хотите удалить все до последнего - используйте ## вместо # .

Чтобы сломать это:

  • Параметр for выполняет перебор всех файлов в текущем каталоге (*) и вызывает mv для каждого найденного файла.
  • -- говорит mv прекратить синтаксический анализ параметров и является защитой от того, чтобы файлы, начинающиеся с - не интерпретировались как параметры (например, файл с именем -i заставит mv запросить вас перед перемещением).
  • ${f#*- } - это манипулирование строками, которое удаляет ненужную часть из каждого имени файла.
  • Все переменные заключены в кавычки, чтобы не допустить повторения команды в именах файлов с пробелами или символами глобализации. Всегда заключайте в кавычки ваши переменные.

rename

С rename которое обычно встречается в дистрибутивах Linux, например, если вы хотите указать исполнителя:

rename 's/Versailles - //' *

Или, если вы хотите удалить все до последнего -:

rename 's/.*- //' *

Zsh

В Zsh и zmv, которые вам нужно загрузить с autoload -U zmv:

zmv 'Versailles - (*)' '$1'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .