Vim批量重命名

时间:2015-05-21 15:48:20

标签: vim

我想用Vim批量更改文件扩展名。我找到this link,建议:

将所有.JPEG扩展名更改为.jpg:

:%s/.*/mv -i & &/g
:%s/.JPEG$/.jpg/g

不幸的是,它无法解释为什么会这样。我在基本情况下使用了:%s,但有人可以解释这里发生了什么吗?

3 个答案:

答案 0 :(得分:2)

:%s/.*/mv -i & &/g

替换文档中的每一行(比如“line”),并用“mv -i line line”替换它。 .*是一个正则表达式“任何字符,重复多次”。 &表示“已发现的内容”。

:%s/.JPEG$/.jpg/g

在任意行的末尾搜索.JPEG(因此$)并将其替换为.jpg

所以,如果你有一个带

的文件
foo.JPEG
bar.png
baz.jpg

在第一个命令之后,它将成为

mv -i foo.JPEG foo.JPEG
mv -i bar.png bar.png
mv -i baz.jpg baz.jpg

然后在第二个命令后,

mv -i foo.JPEG foo.jpg
mv -i bar.png bar.png
mv -i baz.jpg baz.jpg

答案 1 :(得分:2)

您只关注重命名的:substitute命令;关键的整理行为是

:%!bash

将重命名shell命令(这就是为每个文件名添加mv的原因)发送到外部shell以供执行。

基本上,这个技巧使用了Vim优秀的shell集成(用于从标准输入读取文件列表,以及通过外部命令管道文本)来将文件重命名转换为文本编辑任务。缺点是它不便携;给定的命令仅适用于Unix系列操作系统;对于Windows,需要调整命令。

答案 2 :(得分:1)

第一个命令期望文件包含每行一个文件名/路径。 &是匹配表达式的引用(.*已匹配的内容。)

所以它转过来了:

foo.JPEG

成:

mv -i foo.JPEG foo.JPEG

第二个命令然后匹配行尾的所有.JPEG$锚点正在做什么)。因此,行末尾的所有.JPEG都会被.jpg替换。然后你有:

mv -i foo.JPEG foo.jpg