Я пытался пакетно переименовать группу файлов, чтобы они были согласованными и вписывались в структуру имен, которую я придумал. Например, я переименовываю комиксы, и поэтому у меня есть каталог, который выглядит следующим образом:
$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 для будущего использования.
Я предполагаю, что (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}
работает.
Я думаю, что Вы неправильно понимаете значение карата (^
) привязка к строке - это не означает, 'ищут шаблон, запускающийся со следующего 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
Обратите внимание, что обычно существует несколько различных способов соответствовать и переименовать определенный набор файлов - я не уверен, что это является самым эффективным или устойчивым однако, я надеюсь, что он иллюстрирует то, что я думаю, что Вы стреляли для.