Пакетное переименование определенного текста в имени папки

Есть ли способ изменить заглавные буквы текста для папок, но оставить текст в скобках без изменений? Есть ли способ сделать это pyRenamer?

Например, если имена папок называются:

dogs bark - cats miaow [DBCM001]
james peach - jack beanstalk [JPJB521]
small pond - big fish (revive) [FIN07CD]

Изменить на:

Dogs Bark - Cats Miaow [DBCM001]
James Peach - Jack Beanstalk [JPJB521]
Small Pond - Big Fish (revive) [FIN07CD]

Все формулировки в скобках противоречивы. Есть более 1000 папок для переименования!

Как я могу это сделать?

1
задан 6 January 2018 в 15:54

1 ответ

Вы можете сделать это с помощью rename:

$ rename -n 's/(?<![([])(\b\w)/uc($1)/eg' */
dogs bark - cats miaow [DBCM001]/ -> Dogs Bark - Cats Miaow [DBCM001]/
james peach - jack beanstalk [JPJB521]/ -> James Peach - Jack Beanstalk [JPJB521]/
small pond - big fish (revive) [FIN07CD]/ -> Small Pond - Big Fish (revive) [FIN07CD]/

-n заставляет rename печатать то, что он будет делать, фактически ничего не делая. Удалите -n, как только вы убедитесь, что он работает так, как вы хотите.

s/from/to/ является оператором замены и заменит from на to. Здесь я даю это:

  • (?<![([]): это называется негативным взглядом позади . Общий формат - (?<!foo), и он означает «игнорировать любые совпадения, если предыдущее слово - foo». Здесь я даю ему паттерн [([], это класс символов (определенный в [ ]), состоящий из двух символов: [ и (. Таким образом, все это означает «игнорировать любые совпадения, которые идут сразу после [ или (.

  • (\b\w): \b соответствует слову » border ". Это якорь длины 0, который соответствует точке перехода между словом и несловом. Так, например, он совпадает в начале строки, или в пробеле, или в любом другой несловесный символ. \w, с другой стороны, соответствует символу слова. Таким образом, \b\w соответствует 1-й букве слова. Скобки вокруг него «захватывают» его, поэтому мы можем ссылаться на него как $1 с правой стороны от оператора подстановки.

  • uc($1): это то, что мы заменяем тем, что мы сопоставили. Как объяснено выше, так как совпадение в скобках, мы Теперь можно ссылаться на него как $1. uc() - это функция Perl, которая делает вещи ВЕРХНИМ СЛУЧАЕМ. Так что это просто означает «печатать совпадение прописными буквами».

  • eg : это переключатели, влияющие на поведение s///. В частности, e позволяет exec Использование команд в правой части, что позволяет нам использовать uc(), а g применяет подстановку глобально ко всем совпадениям в строке.

Наконец, */ означает «выполнить команду во всех каталогах в текущем каталоге».


Если вы также хотите использовать заглавные буквы в скобках, вы можете использовать это вместо:

$ rename -n 's/(?<!\[)(\b\w)/uc($1)/eg' */
dogs bark - cats miaow [DBCM001] -> Dogs Bark - Cats Miaow [DBCM001]
james peach - jack beanstalk [JPJB521] -> James Peach - Jack Beanstalk [JPJB521]
small pond - big fish (revive) [FIN07CD] -> Small Pond - Big Fish (Revive) [FIN07CD]
2
ответ дан 6 January 2018 в 15:54
  • 1
    okei, благодарите за совет, но, Как я могу установить и reistall диск? – Enrico Caponi 3 June 2012 в 15:24
  • 2
    okei, благодарите за совет, но, Как я могу установить и reistall диск? – Enrico Caponi 3 June 2012 в 15:24

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

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