Linux rename命令批量重命名的方法

Linux的 rename 命令有兩個版本,一個是C語言版本的,一個是Perl語言版本的,早期的Linux發(fā)行版基本上使用的是C語言版本的,現(xiàn)在已經(jīng)很難見到C語言版本的了,由于歷史原因,在Perl語言大紅大紫的時候,Linux的工具開發(fā)者們信仰Perl能取代C,所以大部分工具原來是C版本的都被Perl改寫了,因為Perl版本的支持正則處理,所以功能更加強大,已經(jīng)不再需要C語言版本的了。
如何區(qū)分系統(tǒng)里的rename命令是哪個版本的?
輸入 man rename 看到第一行是
RENAME(1) Linux Programmer’s Manual RENAME(1)
那么 這個就是C語言版本的。
而如果出現(xiàn)的是:
RENAME(1) Perl Programmers Reference Guide RENAME(1)
這個就是Perl版本的了!
兩個版本的語法差異:
C語言的,按照man上面的注解,
rename的語法格式是:
rename fromtofile
這個命令有三個參數(shù),分別是 from : 修改什么名字, to:改成什么名字, file 需要修改的文件是哪些。
用法示例:
比如,有一批文件,都是以 log開頭的, log001.txt, log002.txt ……. 一直到 log100.txt
現(xiàn)在想要把這批文件的log全部替換為 history
rename log history log*
這句命令的意思很明白了,把 以 log開頭的所有文件中的 log字符替換為 history
這樣替換后的文件是: history001.txt, history002.txt ….. 一直到 history100.txt
rename C語言版本的另一個man示例是把后綴名批量修改,
比如我們要將所有 jpeg的后綴名圖片文件修改為 jpg文件。
rename .jpeg.jpg*.jpeg
這樣,所有以 .jpeg擴展的后綴名全部被修改為 .jpg
現(xiàn)在總結一下rename C語言版本所能實現(xiàn)的功能: 批量修改文件名,結果是每個文件會被用相同的一個字符串替換掉!也就是說,無法實現(xiàn)諸如循環(huán) 然后按編號重命名!
Perl 版本的批量重命名,帶有Perl的好處是,你可以使用正則表達式來完成很奇特的功能。
perl 版本的參數(shù)格式:
rename perlexprfiles
注意,perl版本的rename只有兩個參數(shù),第一個參數(shù)為perl正則表達式,第二個參數(shù)為所要處理的文件
man rename的幫助示例:
1) 有一批文件,以 .bak結尾,現(xiàn)在想把這些 .bak 統(tǒng)統(tǒng)去掉。
rename 's/\.bak$//' *.bak
這個命令很簡單,因為我還沒有系統(tǒng)學習過perl,我不知道perl里替換字符串是不是這么干的,但sed是這么干的,所以如果你有sed或者tr基礎,很容易明白,這個替換和sed里的正則語法是一模一樣的。
2) 把所有文件名內(nèi)含有大小字母的,修改為小寫字母。
rename 'y/A-Z/a-z/' *
依然和sed的替換語法一樣,不用多解釋,如果看不懂的話,可以系統(tǒng)學習一下sed先。
還有幾個比較實用的例子:
批量去掉文件名里的空格
Linux文件名本來是不支持空格的,不知道什么時候允許了,當然,在命令行調(diào)用文件的時候,空格是很有問題滴,比如你 原來可以直接 mv oldfile newfile 但有空格就不行了 , 得加雙引號: mv “oldfile” “newfile” 或者用反斜杠轉(zhuǎn)移 \[] ,這樣還好,但如果你直接把含有空格的圖片名引入 Latex文檔,Latex生成pdf的時候會直接打印出文件名,之前這個問題苦惱了我很久,我生成的pdf怎么老是出現(xiàn)文件名呢?后來才發(fā)現(xiàn)原來是文件名內(nèi)含有空格的問題!windows系統(tǒng)下生成的文件名是天生含有空格的,雖然很討厭,但有些惠普掃描儀生成的圖片默認就加入了空格,沒有辦法,只好去掉他,在系統(tǒng)研究rename命令前,我是用 mv 去除空格的。
網(wǎng)上流程的兩個去空格的版本:
1) tr 版:
find . -type f -name "* *" -print |
while read name; do
na=$(echo $name | tr ' ' '_')
if [[ $name != $na ]]; then
mv "$name" $na
fi
done
這個版本以前我一直用的,不知道哪個網(wǎng)上搜刮來的,當時還沒有系統(tǒng)的學習過 tr/sed/awk命令。
注解一下,很好理解, find . type f -name “* *” -print 這一句是查找當前目錄下所有類型為普通文件的 并且名字之中含有空格的文件,并打印出來,其實 find默認就是打印的 這個 -print 多余了,然后 通過管道傳輸給 while 循環(huán)讀取,文件名放到 name 變量里,用 tr 命令 替換空格為 下劃線。 下面判斷如果執(zhí)行后的名稱不相同,使用 mv 命令重命名。但這個if判斷可有可無,因為find已經(jīng)查詢了所有文件名中含有空格的,那么經(jīng)過 tr 命令后, $na變量肯定不等于 $name 變量的。
所以這段代碼可以簡化:
find . -type f -name "* *" |
while read name; do
na=$(echo $name | tr ' ' '_')
mv "$name" "$na"
done
tr 可以看著是 sed 的一個精簡版本,tr 用下劃線來替換空格。
還有一個 是 sed 版本實現(xiàn):
for f in *;do mv "$f" `echo "$f" | sed 's/[ ]\+/_/g' `; done
這里的 sed表達式還可以這樣寫:
sed 's/[[:space:]]\+/_/g'
不過記住,sed里的出現(xiàn)一次或多次的加號是需要添加反斜杠的。即:\+
這樣就可以了。
好了,這兩種辦法都太羅嗦了,看看rename實現(xiàn)吧:
rename 's/[ ]+/_/g' *
OK就這么簡單。
方括號內(nèi)的空格可以用 [:space:]代替,
即可以寫成 ‘s/[[:space:]]+/_/g’
這里注意,rename 采用的是標準perl正則語法,所以無須將 加號轉(zhuǎn)變?yōu)榉葱备芗犹?。即 + 不能修改為 \+,否則替換失敗。
還有幾個好玩的例子:
比如統(tǒng)一在文件頭部添加上 hello
rename 's/^/hello/' *
統(tǒng)一把.html擴展名修改為 .htm
rename 's/.html$/.htm/' *
統(tǒng)一在尾部追加 .zip后綴:
rename 's/$/.zip/' *
統(tǒng)一去掉.zip后綴:
rename 's/.zip$//' *
規(guī)則化數(shù)字編號名,比如 1.jpg, 2.jpg ….. 100.jpg , 現(xiàn)在要使文件名全部三位即 1.jpg …. 001.jpg
運行兩次命令:
rename 's/^/00/' [0-9].jpg
# 這一步把 1.jpg ..... 9.jpg 變幻為 001.jpg .... 009.jpg
rename 's/^/0/' [0-9][0-9].jpg
# 這一步把 10.jpg ..... 99.jpg 變幻為 010.jpg ..... 090.jpg
Ok ,rename就研究了這么多,暫時不知道如何在rename中引入動態(tài)變量,比如 $i++
我測試過 i=0; rename -n “s/^.*$/$((++i))/” * 執(zhí)行后i被自增了1,并非想我想像中那樣,可以在每操作一個文件自增一,猜想可能是因為rename批量實現(xiàn)的,導致++i只計算一次!
-n 用來測試rename過程,并不直接運行,可以查看測試效果后,然后再運行。
相關文章
Fedora Linux 42 穩(wěn)定版發(fā)布: 帶來大量新功能和軟件更新
Fedora 42昨日發(fā)布,這是 Red Hat 贊助開發(fā)的杰出前沿 Linux 發(fā)行版的最新版,包含大量新功能和軟件更新,使其成為 2025 年上半年發(fā)布的一款出色的 Linux 操作系統(tǒng)之一,內(nèi)2025-04-16如何在Linux查看硬盤信息? 查看Linux硬盤大小類型和硬件信息的5種方法
使用Linux系統(tǒng)的過程中,查看和了解硬盤信息是非常重要的工作,尤其是對于系統(tǒng)管理員而言,那么在Linux系統(tǒng)中如何查看硬盤信息?以下是具體內(nèi)容介紹2025-03-12如何在 Linux 中查看 CPU 詳細信息? 3招輕松查看CPU型號、核心數(shù)和溫度
在日常運維工作中,獲取 CPU 信息是系統(tǒng)運維管理員常見的工作內(nèi)容,無論是為了性能調(diào)優(yōu)、硬件升級還是僅僅滿足好奇心2025-03-11什么是 Arch Linux? 獨樹一幟的Arch Linux發(fā)行版分析
Arch Linux是為簡化,優(yōu)化,現(xiàn)代化,實用主義,用戶中心和多功能性而創(chuàng)建Linux發(fā)行版,究竟是什么讓 Arch 與眾不同?下面我們就來簡要解讀2025-02-19如何在Linux環(huán)境下制作 Win11裝機U盤?
一直用的linux辦公,想要將筆記本電腦從 Linux 系統(tǒng)切換回 Windows 11,我們可以制作一個win11裝機u盤,詳細如下2025-02-17Rsnapshot怎么用? 基于Rsync的強大Linux備份工具使用指南
Rsnapshot 不僅可以備份本地文件,還能通過 SSH 備份遠程文件,接下來詳細介紹如何安裝、配置和使用 Rsnapshot,包括創(chuàng)建每小時、每天、每周和每月的本地備份,以及如何進2025-02-06Linux Kernel 6.13發(fā)布:附更新內(nèi)容及新特性解讀
Linux 內(nèi)核 6.13 正式發(fā)布,新版本引入了惰性搶占支持,簡化內(nèi)核搶占邏輯,通過減少與調(diào)度器相關的調(diào)用次數(shù),讓內(nèi)核在運行時表現(xiàn)更優(yōu),從而提高效率2025-01-23五大特性引領創(chuàng)新! 深度操作系統(tǒng) deepin 25 Preview預覽版發(fā)布
今日,深度操作系統(tǒng)正式推出deepin 25 Preview版本,該版本集成了五大核心特性:磐石系統(tǒng)、全新DDE、Treeland窗口合成器、AI For OS以及Distrobox子系統(tǒng)2025-01-18Linux Mint Xia 22.1重磅發(fā)布: 重要更新一覽
Beta 版 Linux Mint“Xia” 22.1 發(fā)布,新版本基于 Ubuntu 24.04,內(nèi)核版本為 Linux 6.8,這次更新帶來了諸多優(yōu)化和改進,進一步鞏固了 Mint 在 Linux 桌面操作系統(tǒng)領域的2025-01-16LinuxMint怎么安裝? Linux Mint22下載安裝圖文教程
Linux Mint22發(fā)布以后,有很多新功能,很多朋友想要下載并安裝,該怎么操作呢?下面我們就來看看詳細安裝指南2025-01-16