我想用Vim批量更改文件扩展名。我找到this link,建议:
将所有.JPEG扩展名更改为.jpg:
:%s/.*/mv -i & &/g
:%s/.JPEG$/.jpg/g
不幸的是,它无法解释为什么会这样。我在基本情况下使用了:%s
,但有人可以解释这里发生了什么吗?
答案 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