在Emacs中重新排列文件名

4

我有一批格式相同的文件,比如说bmp格式,文件名为0.bmp 1.bmp99.bmp。我想要更改这些文件名,比如将0.bmp改为99.bmp,将1.bmp改为98.bmp等等。在dired-mode下,Emacs能够实现这个功能吗?我使用的是Windows系统下的Emacs。


在搜索了一些问题后,我发现https://dev59.com/rXI_5IYBdhLWcg3wJPdu#1510716解决了一个类似的问题。 - toolchainX
3个回答

7
你可以使用 M-x wdired-change-to-wdired-mode 命令使 dired 缓冲区可编辑。之后,从 dired 缓冲区结尾开始,使用一个简单的带 计数器 的键盘宏即可完成操作。
如果不想使用宏,另一种选择是:
M-x replace-regexp
Replace regexp: ^[0-9]+
Replace regexp with \,(- 99 \#&)

嗯...这将把0.bmp转换为1.bmp。操作者想要将0转换为99,1转换为98等。可以通过类似的更改正则表达式计算来完成,但是要改为(- 99 \#&) - Diego Sevilla
1
哦,我完全误读了。我更新了我的回答。谢谢! :-) - Bozhidar Batsov
谢谢!这正是我想要的,因为我对 emacs-lisp 了解很少。 - toolchainX

2

可能是一个快速且不太通用的答案:

首先,在dired-mode下按C-x C-q

其次,按M-:,然后粘贴代码片段并按 RET:

(progn 
  (beginning-of-buffer)
  (while (re-search-forward "\\([0-9]+\\).bmp" nil t)
    (replace-match
     (format "%d.bmp" (- 99 (string-to-number (match-string 1))))
     nil
     nil)))

第三步:按下 C-c C-c 保存更改,完成。

1

我不确定 dired-mode,但你可以在 *scratch* 缓冲区中执行一个简单的脚本。由于你要用不同的名称替换现有的文件名,我建议你先对所有文件进行第一次重命名,然后再从这些名称开始:

 (progn 
  (dotimes (i 100) 
    (let ((file-name (concat (number-to-string i) ".bmp")))
      (rename-file file-name (concat "old" file-name))))
  (dotimes (i 100)
    (let ((file-name-old (concat "old" (number-to-string i) ".bmp"))
          (file-name-new (concat (number-to-string (- 99 i)) ".bmp")))
      (rename-file file-name-old file-name-new))))

如果你将它复制到*scratch*缓冲区中,然后粘贴表达式并按下C-x C-e,那么该代码将为您执行此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接