Есть ли способ изменить заглавные буквы текста для папок, но оставить текст в скобках без изменений? Есть ли способ сделать это 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 папок для переименования!
Как я могу это сделать?
Вы можете сделать это с помощью 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]