有没有办法更改文件夹文本的大小写,但保持括号内的文本不变?有没有办法用 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
您可以使用以下方式执行此操作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
”。这里,我给它一个模式[([]
,这是一个字符类(由 定义[ ]
),由以下字符组成:[
和(
。所以整个意思是“忽略紧跟在 a[
或 a之后的任何匹配项(
。(\b\w)
:\b
匹配“词边界”。这是一个长度为 0 的锚点,它匹配单词和非单词之间的过渡点。因此,例如,它匹配行首、空格或任何其他非单词字符。另一方面,\w
匹配单词字符。因此,匹配单词的第一个字母。它周围的括号“捕获”了它,因此我们可以在替换运算符的右侧\b\w
引用它。$1
uc($1)
:这就是我们用来替换匹配内容的内容。如上所述,由于匹配项在括号中,因此我们现在可以将其称为$1
。uc()
是一个 Perl 函数,可使内容大写。因此,这仅表示“以大写形式打印匹配项”。eg
:这些是影响 行为的开关s///
。具体来说,e
允许在右侧执行命令,这让我们可以使用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]