前言:今天有一個小插曲,需要將某一目錄下所有文件名中 xxx_collect_xxx 中的 collect 修改爲 mapping_mrg ,還好我要修改的只有四個,但重複的4次mv命令還是讓人頭大,所以就考慮有沒有什麼方法可以一次性修改這裏面所有相關文件的文件名,畢竟如果下次是40個文件呢?
vim命令行模式 & vim下調用shell命令
- 在vim下輸入
:
就會進入命令行模式,使用vim內置命令可以很方便進行一些操作。比如
:set list
顯示vim不可見字符;
:set fileencoding
查看文件編碼格式;
:%s/string1/string2
將當前文件中每一行出現的第一個string1替換爲string2;使用 & 可以引用string1的內容,比如:%s/string1/m&
string1將被替換爲 mstring1
:%s/string1/string2/g
將所有string1替換爲string2 - vim下調用shell命令:
:!{cmd}
會將cmd執行結果顯示在標準輸出上;
:read !{cmd}
將cmd執行結果重定向到當前vim緩衝中;
:write !{cmd}
將當前vim緩衝作爲cmd輸入,比如執行:write !sh
會將當前vim中每行作爲shell命令並執行。
Vim執行shell命令及使用Vim批量更改文件名
正則表達式匹配任意字符 & 分組捕獲和反向引用
.
匹配單個字符
*
匹配前面那個字符任意多次
.*
匹配任意多個字符,很常用- 分組捕獲
基礎正則中,使用括號可以對匹配內容進行分組並暫時保存,分組後會有分組編號,可以使用反斜線加編號\N
的方式反向引用這些分組。
比如對於xxx_collect_xxx,就可以表示爲 (.*)collect(.*) ,用\1
表示collect前面的部分,用\2
表示collect後面的部分
基礎正則表達式
利用 vim 批量修改文件名
有了上面的基礎知識,前言部分的內容也就容易做到了。
- 終端執行
vim
打開vim頁面,執行:read !ls *collect*
列出當前目錄所有名稱中包含collect的文件名,並將結果重定向到當前vim緩衝 :0d
目的是刪除第一個空行:%s/\(.*\)collect\(.*\)/mv & \1mapping_mrg\2/g
結合了%s替換命令和正則表達式。\(.*\)
中\
作爲轉義字符轉義(
和)
,最終vim緩衝的內容就變成了mv xxx_collect_xxx xxx_mapping_xxx
:write !sh
將vim緩衝內容作爲shell命令執行,最後:q!
退出vim,當前目錄已經完成修改!