批量重命名文件夹名称内的特定文本

批量重命名文件夹名称内的特定文本

有没有办法更改文件夹文本的大小写,但保持括号内的文本不变?有没有办法用 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/替换运算符,将替换fromto。这里,我给出它:

  • (?<![([]):这被称为负面后视。一般格式是(?<!foo),意思是“如果前一个单词是 ,则忽略所有匹配项foo”。这里,我给它一个模式[([],这是一个字符类(由 定义[ ]),由以下字符组成:[(。所以整个意思是“忽略紧跟在 a[或 a之后的任何匹配项(

  • (\b\w)\b匹配“词边界”。这是一个长度为 0 的锚点,它匹配单词和非单词之间的过渡点。因此,例如,它匹配行首、空格或任何其他非单词字符。另一方面,\w匹配单词字符。因此,匹配单词的第一个字母。它周围的括号“捕获”了它,因此我们可以在替换运算符的右侧 \b\w引用它。$1

  • uc($1):这就是我们用来替换匹配内容的内容。如上所述,由于匹配项在括号中,因此我们现在可以将其称为$1uc()是一个 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]

相关内容