从 TitleCase -> Title Case 批量重命名文件(空格分隔)

Gru*_*ner 5 rename

我有一个 38GB 的​​文件夹,里面有 800 个 MP4 视频。重新下载后,文件名没有空格,所有单词都连在一起,但还是TitleCase。

所以从TitleCase我需要Title Case

批量重命名这些文件的最有效方法是什么?

我记得很久以前我的发行版中就包含了renameautorename,但现在似乎没有了。

Gil*_*not 12

如果要在 mp4 文件名 TitleCase 的每个“单词”之间添加空格(PascalCase 到以空格分隔的单词):

rename -n 's/\B[[:upper:]]/ $&/g' ./*.mp4
Run Code Online (Sandbox Code Playgroud)

输出

rename(./FooBarBaz.mp4, ./Foo Bar Baz.mp4)
Run Code Online (Sandbox Code Playgroud)

查看这篇文章,其中深入详细介绍了 Perlrename

重命名不同的版本和用法怎么样?特别推荐使用 Perl 版本的方式是什么?

  • @GillesQuenot 在每个提到 perl `rename` 的问题或答案中发布答案的链接至少接近垃圾邮件。IMO,它远远超出了“濒临”的范围,并且肯定跨越了垃圾邮件领域 - 到目前为止,您已经对我的三个(古老的)答案发布了完全相同的评论。 (2认同)
  • 我没有被冒犯,也没有把这当成是针对我个人的。我只是讨厌垃圾邮件——带着深深、强烈和永恒的厌恶。收到 3 条(到目前为止)完全相同的自我推销评论的通知是垃圾邮件,而这只是我收到的通知 - 我不知道您还向谁发送了垃圾邮件,也不知道有多少条。如果我得到更多,情况会更糟,因为它会是更多垃圾邮件(并且由于我在过去十年左右的时间里使用 perl rename 发布了许多答案,如果您继续您的垃圾邮件方式,我几乎肯定会这样做得到更多)。 (2认同)

Mar*_*ler 8

我不知道什么是最有效的方法(我认为你的意思是有效),但我会快速编写一个 for 循环,例如:

\n
for file in *.mp4; do\n  newname="$(echo "$file" | sed \'s/\\(.\\)\\([A-Z]\\)/\\1 \\2/g\')"\n  mv "${file}" "${newname}"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n

解释:

\n
  newname="$(echo "$file" | sed \'s/\\(.\\)\\([A-Z]\\)/\\1 \\2/g\')"\n#        ^-------------------- Assign to  variable "newname" value\xe2\x80\xa6\n#         ^------------------- "$()": as output by commannd in parentheses;\n#                              use "" to avoid word splitting\n
Run Code Online (Sandbox Code Playgroud)\n

在哪里

\n
echo $file | sed \'s/\\(.\\)\\([A-Z]\\)/\\1 \\2/g\'\n#    ^-------------------------------------- output old file name\n#          ^-------------------------------- pipe to `sed` command\n
Run Code Online (Sandbox Code Playgroud)\n

sed是“流编辑器”的名称;它接受输入,对其执行命令,并产生输出。这里的命令是s,如“搜索和替换”中所示。

\n
s/\\(.\\)\\([A-Z]\\)/\\1 \\2/g\n^^ ^  ^ ^      ^ ^  ^  ^\n|| |^ | | ^^^  | |  |  |\n\\------------------------ s: search and replace\n \\----------------------- /: Set the search;replace;flags separator to "/"\n   || | | \\|/  | \\  /  |\n   \\--+------------------ \\(\xe2\x80\xa6\\): a "capture group" (the first one);\n    |   |  |   |  ||   |         whatever is matches the content will be\n    |   |  |   |  \\|   |         available as \\1\n    \\-------------------- .: We match ".", which means *any* character\n        |  |   |   |   |  (which precludes this from matching at start of line)\n        \\------+--------- \\(\xe2\x80\xa6\\): Second capture group, \\2\n           \\------------- [A-Z]: Match any capital letter\n                   |   |\n                   \\----- Replacement: "\\1 \\2" replace\n                       |  "characterbeforecapitalletter""Capitalletter" with\n                       |  "characterbeforecapitalletter" "Capitalletter"\n                       |\n                       \\- g: Flag that means "global": Repeat this until\n                             end of line\n
Run Code Online (Sandbox Code Playgroud)\n

  • 哦,最后一个代码块中的图表! (2认同)