如何高效地批量替换文件的后缀名?

假设我有一个文件夹,下面还有一堆子文件夹,每一个文件夹中含若干.js 文件,我想批量把它们全部修改成 .jsx 文件,Emacs 里面有什么高效的做法吗?

我知道可以用 dired,但是貌似不是很高效。

1 个赞
  • M-! for f in *.js; do mv -v $f ${f}x; done RET
  • 用 Dired 应该会直观很多,但 Dired 操控的 ls(1) 似乎没法像 ls *.js 这样过滤文件,至少我不知道,但是用 M-x find-dired some-folder -name ‘*.js’ 可以,之后打开(C-x C-q) Wdired mode 编辑。
3 个赞

这个目前算是比较好的方法

既然有了wdired mode,也就无需过滤什么文件了,用iedit-mode或者全局替换应该都行的

1 个赞

对,这种方法更好。C-M-% \.js$ RET .jsx RET

贴个图更直观:

1 个赞

虽然并不是用emacs 但这种需求我一般直接用rename 如 rename ‘.js’ ‘.jsx’ ./*

递归的话就利用 find

3 个赞

是,一目了然。但应该需要第三方插件吧,印象中 visual-regexp 和 anzu 都有这个功能,我原来用过,后来不记得什么原因禁用掉了。

对,这两个插件提供预览.

第一次知道还有rename这个命令~一般rename都用mv了.

哈哈是的,不过感觉rename更像是把文件名作为文本进行文本处理,包括一些正则替换之类的功能

(反正我一般就用来各种改后缀名2333333

如果这之前文件已经打开,那么 emacs 是不知道文件名已经变更了吧,然后自动保存会不会产生一堆新文件?

对于没修改的文件,Auto Save 不会执行任何动作,而一般要重命名前需要保存文件。

对于我的这个需求,可能命令行算是最高效,也是最灵活的了。我这个命令行狂魔,舍近求远了 :joy:

如果文件夹底下的若干文件已经在 emacs 里打开,还要继续编辑,这个时候 dired 就比 shell 命令好用了。dired 改过之后,所有 buffer 都指向新的文件名,“最近打开”里也不会看到无效路径。

1 个赞
  1. c-x d 进入dired模式
  2. c-x c-q启用编辑
  3. m-x replace-string 替换文件后缀

也可以 find-name-dired 然后 wdired。