rename 修改檔名

2022-03-29 23:44:28 字數 3895 閱讀 9595

linux的 rename 命令有兩個版本,乙個是c語言版本的,乙個是perl語言版本的,早期的linux發行版基本上使用的是c語言版本的,現在已經很難見到c語言版本的了,由於歷史原因,在perl語言大紅大紫的時候,linux的工具開發者們信仰perl能取代c,所以大部分工具原來是c版本的都被perl改寫了,因為perl版本的支援正則處理,所以功能更加強大,已經不再需要c語言版本的了。

如何區分系統裡的rename命令是哪個版本的?

輸入 man rename 看到第一行是

rename(1) linux programmer』s manual rename(1)

那麼 這個就是c語言版本的。

而如果出現的是:

rename(1)    perl programmers reference guide    rename(1)

這個就是perl版本的了!

兩個版本的語法差異:

c語言的,按照man上面的註解,

rename的語法格式是:

rename fromtofile

這個命令有三個引數,分別是 from : 修改什麼名字, to:改成什麼名字, file 需要修改的檔案是哪些。

用法示例:

比如,有一批檔案,都是以 log開頭的, log001.txt,  log002.txt ……. 一直到 log100.txt

現在想要把這批檔案的log全部替換為 history

rename  log history log*

這句命令的意思很明白了,把 以 log開頭的所有檔案中的 log字元替換為 history

這樣替換後的檔案是: history001.txt,  history002.txt ….. 一直到 history100.txt

rename c語言版本的另乙個man示例是把字尾名批量修改,

比如我們要將所有 jpeg的字尾名檔案修改為 jpg檔案。

這樣,所有以 .jpeg擴充套件的字尾名全部被修改為 .jpg

現在總結一下rename c語言版本所能實現的功能: 批量修改檔名,結果是每個檔案會被用相同的乙個字串替換掉!也就是說,無法實現諸如迴圈 然後按編號重新命名!

perl 版本的批量重新命名,帶有perl的好處是,你可以使用正規表示式來完成很奇特的功能。

perl 版本的引數格式:

rename  perlexprfiles

注意,perl版本的rename只有兩個引數,第乙個引數為perl正規表示式,第二個引數為所要處理的檔案

man rename的幫助示例:

1) 有一批檔案,以 .bak結尾,現在想把這些 .bak 統統去掉。

2) 把所有檔名內含有大小字母的,修改為小寫字母。

rename      'y/a-z/a-z/'      *

依然和sed的替換語法一樣,不用多解釋,如果看不懂的話,可以系統學習一下sed先。

還有幾個比較實用的例子:

批量去掉檔名裡的空格

linux檔名本來是不支援空格的,不知道什麼時候允許了,當然,在命令列呼叫檔案的時候,空格是很有問題滴,比如你 原來可以直接  mv  oldfile  newfile  但有空格就不行了 , 得加雙引號: mv 「oldfile」  「newfile」 或者用反斜槓轉移  \ ,這樣還好,但如果你直接把含有空格的名引入 latex文件,latex生成pdf的時候會直接列印出檔名,之前這個問題苦惱了我很久,我生成的pdf怎麼老是出現檔名呢?後來才發現原來是檔名內含有空格的問題!windows系統下生成的檔名是天生含有空格的,雖然很討厭,但有些惠普掃瞄器生成的預設就加入了空格,沒有辦法,只好去掉他,在系統研究rename命令前,我是用 mv 去除空格的。

網上流程的兩個去空格的版本:

1) tr 版:

複製**

**如下:

find . -type f -name "* *" -print |

while read name; do

na=$(echo $name | tr ' ' '_')

if [[ $name != $na ]]; then

mv "$name" $na

fidone

這個版本以前我一直用的,不知道哪個網上搜刮來的,當時還沒有系統的學習過 tr/sed/awk命令。

註解一下,很好理解, find . type f -name 「* *」 -print 這一句是查詢當前目錄下所有型別為普通檔案的 並且名字之中含有空格的檔案,並列印出來,其實 find預設就是列印的 這個 -print 多餘了,然後 通過管道傳輸給 while 迴圈讀取,檔名放到 name 變數裡,用 tr 命令 替換空格為 下劃線。 下面判斷如果執行後的名稱不相同,使用 mv 命令重新命名。但這個if判斷可有可無,因為find已經查詢了所有檔名中含有空格的,那麼經過 tr 命令後, $na變數肯定不等於 $name 變數的。

所以這段**可以簡化:

複製**

**如下:

find . -type f -name "* *" |

while read name; do

na=$(echo $name | tr ' ' '_')

mv "$name" "$na" 

done

tr 可以看著是 sed 的乙個精簡版本,tr 用下劃線來替換空格。

還有乙個 是 sed 版本實現:

for f in *;do mv "$f" `echo "$f" | sed 's/[ ]\+/_/g' `; done

這裡的 sed表示式還可以這樣寫:

sed 's/[[:space:]]\+/_/g'

不過記住,sed裡的出現一次或多次的加號是需要新增反斜槓的。即:\+

這樣就可以了。

好了,這兩種辦法都太他媽羅嗦了,看看rename實現吧:

rename      's/[ ]+/_/g'       *

ok就這麼簡單。

方括號內的空格可以用 [:space:]代替,

即可以寫成 『s/[[:space:]]+/_/g』

這裡注意,rename 採用的是標準perl正則語法,所以無須將 加號轉變為反斜槓加號 。即 + 不能修改為 \+,否則替換失敗。

還有幾個好玩的例子:

比如統一在檔案頭部新增上 hello

rename         's/^/hello/'       *

統一把.html副檔名修改為 .htm

rename          's/.html$/.htm/'      *

統一在尾部追加 .zip字尾:

rename          's/$/.zip/'      *

統一去掉.zip字尾:

rename          's/.zip$//'      *

規則化數字編號名,比如 1.jpg, 2.jpg ….. 100.jpg , 現在要使檔名全部三位即 1.jpg …. 001.jpg

執行兩次命令:

複製**

**如下:

# 這一步把 1.jpg ..... 9.jpg 變幻為 001.jpg .... 009.jpg

# 這一步把 10.jpg ..... 99.jpg 變幻為 010.jpg ..... 090.jpg

ok ,rename就研究了這麼多,暫時不知道如何在rename中引入動態變數,比如 $i++

我測試過 i=0;  rename -n 「s/^.*$/$((++i))/」   *  執行後i被自增了1,並非想我想像中那樣,可以在每操作乙個檔案自增一,猜想可能是因為rename批量實現的,導致++i只計算一次!

-n 用來測試rename過程,並不直接執行,可以檢視測試效果後,然後再執行。

修改檔名並進行排序rename

檔案訪問方式 parentdir rename.py video 0.mp4 1.mp4 2.mp4 3.mp4建立rename.py import os import sys filedir os.path.dirname sys.ar 0 獲取指令碼所在目錄 os.chdir filedir 將...

linux 批量更改檔名 rename 命令

rename 的典型應用 rename 1 2 3 1 要被取代的關鍵字 2 新的關鍵字 3 檔名符合這個規則的才取代 把 img001.jpg,img002.jpg 換成 img001.jpg,img002.jpg rename img img img 把所有 htm 檔案改成 html rena...

檔名 EXCEL批量修改檔名

場景一 面臨問題 將圖紙匯出為pdf格式時,因首字母按拼音排序,導致圖紙順序錯亂,需要在檔名前插入編號,以使檔案按照理想狀態排序。如下圖,預設的 按名稱排序 狀態為 節點 立面 平面 而理想的狀態為 平面 立面 節點 解決辦法 儲存,關閉文字文件。將字尾名 txt 修改為 bat 雙擊執行 提取檔名...