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

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

$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
[ 115] Итак, я попытался сделать следующее:

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

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

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

2
задан 30 September 2013 в 04:13

2 ответа

Я предполагаю, что (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} работает.

0
ответ дан 30 September 2013 в 04:13

Я думаю, что Вы неправильно понимаете значение карата (^) привязка к строке - это не означает, 'ищут шаблон, запускающийся со следующего regex', это означает, 'ищут строку, запускающуюся со следующего шаблона' - который не будет, конечно, соответствовать ни одним из Ваших перечисленных имен файлов, потому что 001... 003 прибывает часть путь через имя.

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

$ 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

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

2
ответ дан 30 September 2013 в 04:13

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

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