Удаление строки файлов с переименованием

Я пытался переименовать несколько файлов, чтобы они были согласованными и вписывались в структуру имен, с которой я столкнулся. Например, я переименовываю комиксы, и поэтому у меня есть каталог, который выглядит так:

$ls *.cbr Injustice - Gods Among Us 001 (2013) (Digital) (K6 of Ultron-Empire).cbr Injustice - Gods Among Us 002 (2013) (Digital) (K6 of Ultron-Empire).cbr Injustice - Gods Among Us 003 (2013) (Digital) (K6 of Ultron-Empire).cbr 

Моя цель – использовать переименование файлов, чтобы они выглядели следующим образом:

 Injustice - Gods Among Us 001.cbr Injustice - Gods Among Us 002.cbr Injustice - Gods Among Us 003.cbr 

Поэтому я попробовал следующее:

 rename -n 's/^\d{3}.\.cbr/^\ $1.cbr/' *.cbr 

Предполагал, что, ограничившись первой настройкой по 3-значной проблеме, я мог бы затем изменить, чтобы переименовать все, начиная с начала строки («Несправедливость – Бог среди нас») и добавить 3-значный номер выпуска (\ d {3}), все будет в стороне. Излишне говорить, что нет.

Хотя мне хотелось бы немного узнать, как это решить, я действительно хочу лучше понять, как использовать прегекс для будущего использования.

Я думаю, что вы неправильно понимаете смысл привязки линии carat ( ^ ) – это не значит «искать шаблон, начинающийся с следующего регулярного выражения», это означает «искать линию, начинающуюся со следующего шаблона » – что будет конечно, не соответствует ни одному из перечисленных вами имен файлов, потому что 001 … 003 входит частично через имя.

Вероятно, вы думаете о конструкциях Perl, например, чтобы ограничить совпадение с частью имени после первой трехзначной последовательности, вы можете использовать (?<=\d{3}) lookbehind . Аналогично, чтобы ограничить совпадение с частью до суффикса .cbr вы можете использовать lookaheaad (?=\.cbr) . Наконец, вы можете сопоставить любые символы между lookbehind и lookahead, то есть .* , и заменить их ничем:

 $ rename -nv 's/(?<=\d{3}).*(?=.cbr)//' *.cbr Injustice - Gods Among Us 001 (2013) (Digital) (K6 of Ultron-Empire).cbr renamed as Injustice - Gods Among Us 001.cbr Injustice - Gods Among Us 002 (2013) (Digital) (K6 of Ultron-Empire).cbr renamed as Injustice - Gods Among Us 002.cbr Injustice - Gods Among Us 003 (2013) (Digital) (K6 of Ultron-Empire).cbr renamed as Injustice - Gods Among Us 003.cbr 

Обратите внимание, что обычно существует несколько разных способов сопоставления и переименования определенного набора файлов – я не уверен, что это самый эффективный или надежный, но я надеюсь, что он иллюстрирует то, что, как я думаю, вы стреляли.

Я предполагаю, что строка (2013) (Digital) (K6 of Ultron-Empire) исправлена ​​во всех файлах, вам не нужно ничего сложного на самом деле:

 $ ls Injustice - Gods Among Us 001 (2013) (Digital) (K6 of Ultron-Empire).cbr Injustice - Gods Among Us 002 (2013) (Digital) (K6 of Ultron-Empire).cbr Injustice - Gods Among Us 003 (2013) (Digital) (K6 of Ultron-Empire).cbr $ rename 's/ \(2013\) \(Digital\) \(K6 of Ultron\-Empire\)//g' * $ ls Injustice - Gods Among Us 001.cbr Injustice - Gods Among Us 003.cbr Injustice - Gods Among Us 002.cbr 

Я отдал гибкость для практичности. Если вы хотите удалить все (...) вы можете использовать еще более умные методы :

 rename -n 's/ ([(].*Digital.*[)])//g' * 

Кроме того, ваше регулярное выражение ничего не выбирает. Я прочитал этот ответ, чтобы понять, как работает \d{3} .