使用 vim 快速對當前文件夾下的文件批量重命名
前言
我們在使用Linux的時候,有很多種方法可以對文件進行重命名,例如 命令行 下的mv命令,或者是使用像dolphin這樣的圖形文件管理器。但是有時候需要對一個文件夾下的所有文件批量重命名,甚至是遞歸地重命名當前文件夾下所有以.xxx結尾的文件,這時候你還在手動地一遍遍敲mv命令再一遍遍按 TAB 補全么?
圖形化的文件管理器
目前 Linux 社區有好多優質的圖形化文件管理器,大多數的風格都與 Windows 大相徑庭。就拿我現在用的 KDE 出品的 dolphin 來說,基本上 Windows 能做到的它也可以做到,當然 我沒有深究其功能,無法評斷好用與否。
但是往往這類文件管理器只能做到一些簡單的功能,其出現就是為了那些剛從 Windows 轉向 Linux 的人不用付出太多的學習成本,至于好不好用則是見仁見智了。
Vim
vim 已經是一個老生常談的話題了,不管你用沒用過也都應該聽說過,畢竟曾經有幾百萬人在互聯網上發問 「如何退出 vim 編輯器」......
那么如何實現批量重命名呢?
先看第一個指令 :read
首先打開 vim (這里我用的是 neovim 兩者無差別)

嘗試下進入 -命令模式- ,輸入
:read !ls

敲一下回車就會發現,vim 把 ls 指令所輸出的內容打印到了我們的編輯器中,也就是說,你只需要在命令模式中輸入上述指令,便可以將 感嘆號 ! 后面的命令的輸出內容打印到屏幕上。
不妨再試一下,輸入
:read !ls -al

Bingo~
再來看下一個指令 :write
我們先來新建一個文件夾: temp,里面放入一些文件,內容如下:
temp > tree
.
├── a.json
├── b.json
├── c.json
└── dir
├── e.json
└── f.json
# 這里的 tree 只是一個指令,功能是以樹形展示目錄結構
在 temp 文件夾下輸入 vim 來啟動 vim,按下 冒號 進入 -命令模式-,輸入:
:read !find ./
這將會把當前目錄下的所有內容打印出來,包括子文件夾下的內容。

我們現在的目的是要把 所有以 .json 結尾的文件改為 .txt 結尾,使用的命令是 mv。
首先,去掉多余的第一行和目錄 ./dir,使用 Ctrl + v 進入 -可視塊- 模式,再每一行的最前面加上 mv, 再加一個空格。

之后,便可以再后面新增 更改后的名稱,這里如果條目少的話可以手敲,但是如果超過十幾行的話就要用到 vim 的 宏 了。
這里簡單說明下具體的做法,首先放出按鍵:
q -> a -> $ -> 5h -> yiw -> $ -> a -> [空格] -> Esc -> p -> a -> .txt -> Esc -> j -> q
一遍一遍試的命令,希望老爺們賞個贊 ??
下面是對每條指令的介紹:
| 指令 | 功能 |
|---|---|
| q | 開始記錄 宏 |
| a | 記錄宏按鍵為 a |
| $ | 將光標移動到行尾 |
| 5h | 光標向前移動 5 格 |
| yiw | 復制當前光標所在的單詞 |
| $ | 將光標移動到行尾 |
| a | 開始插入 |
| <space> | 插入一個空格 |
| <Esc> | 退回到 -普通- 模式 |
| p | 在光標后粘貼剛才復制的內容 |
| a | 開始插入 |
| .txt | 插入 .txt |
| <Esc> | 退回到 -普通- 模式 |
| j | 光標下移一行 |
| q | 結束錄制 宏 |
這樣,便實現了下面的效果:

那要怎么執行這幾行命令呢?記得我們上面的小標題么?
:write
還是一樣,先進入到 -普通- 模式,按一下 冒號 進入 -命令- 模式,輸入:
:write !sh
執行一下

雖然改名成功了,但是子目錄里的文件全部移動到當前目錄下了 ??
(教學事故......)
原因大家也該清楚了,因為 mv 實際上是一個移動文件的指令,我們用它重命名是因為它恰好有這個功能,而在重命名時并沒有加目錄,所以便會釀成剛剛的慘劇......
沒關系,我們再把 e.txt f.txt 移動到 dir 目錄下,這次的任務是將 .txt 結尾的文件改成以 .json 結尾。

重復上面的步驟,只是改一下宏命令:
q -> a -> ^ -> f. -> yf. -> $ -> a -> [空格] -> [Esc] -> p -> a -> json -> [Esc] -> j

這回應該沒問題了吧,執行一下!
:write !sh

果然,成功改回來了!

浙公網安備 33010602011771號