国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

Linux rename命令批量重命名

2016-10-12 17:14:07 985

linux 的 rename 命令有兩個(gè)版本,一個(gè)是C語(yǔ)言版本的,一個(gè)是Perl語(yǔ)言版本的,早期的Linux發(fā)行版基本上使用的是C語(yǔ)言版本的,現(xiàn)在已經(jīng)很難見(jiàn)到C語(yǔ)言版本的了,由于歷史原因,在Perl語(yǔ)言大紅大紫的時(shí)候,Linux的工具開(kāi)發(fā)者們信仰Perl能取代C,所以大部分工具原來(lái)是C版本的都被Perl改寫(xiě)了,因?yàn)镻erl版本的支持正則處理,所以功能更加強(qiáng)大,已經(jīng)不再需要C語(yǔ)言版本的了。

如何區(qū)分系統(tǒng)里的rename命令是哪個(gè)版本的?

輸入 man rename 看到第一行是

RENAME(1) Linux Programmer’s Manual RENAME(1)

那么 這個(gè)就是C語(yǔ)言版本的。

而如果出現(xiàn)的是:

RENAME(1)    Perl Programmers Reference Guide    RENAME(1)

這個(gè)就是Perl版本的了!

兩個(gè)版本的語(yǔ)法差異:

C語(yǔ)言的,按照man上面的注解,

rename的語(yǔ)法格式是:

rename fromtofile

這個(gè)命令有三個(gè)參數(shù),分別是 from : 修改什么名字, to:改成什么名字, file 需要修改的文件是哪些。

用法示例:

比如,有一批文件,都是以 log開(kāi)頭的, log001.txt,  log002.txt ....... 一直到 log100.txt

現(xiàn)在想要把這批文件的log全部替換為 history

1

rename  log history log*

這句命令的意思很明白了,把 以 log開(kāi)頭的所有文件中的 log字符替換為 history

這樣替換后的文件是: history001.txt,  history002.txt ..... 一直到 history100.txt

rename C語(yǔ)言版本的另一個(gè)man示例是把后綴名批量修改,

比如我們要將所有 jpeg的后綴名圖片文件修改為 jpg文件。

1

rename .jpeg.jpg*.jpeg

這樣,所有以 .jpeg擴(kuò)展的后綴名全部被修改為 .jpg

現(xiàn)在總結(jié)一下rename C語(yǔ)言版本所能實(shí)現(xiàn)的功能: 批量修改文件名,結(jié)果是每個(gè)文件會(huì)被用相同的一個(gè)字符串替換掉!也就是說(shuō),無(wú)法實(shí)現(xiàn)諸如循環(huán) 然后按編號(hào)重命名!

Perl 版本的批量重命名,帶有Perl的好處是,你可以使用正則表達(dá)式來(lái)完成很奇特的功能。

perl 版本的參數(shù)格式:

rename  perlexprfiles

注意,perl版本的rename只有兩個(gè)參數(shù),第一個(gè)參數(shù)為perl正則表達(dá)式,第二個(gè)參數(shù)為所要處理的文件

man rename的幫助示例:

1) 有一批文件,以 .bak結(jié)尾,現(xiàn)在想把這些 .bak 統(tǒng)統(tǒng)去掉。

1

rename     's/.bak$//'       *.bak

這個(gè)命令很簡(jiǎn)單,因?yàn)槲疫€沒(méi)有系統(tǒng)學(xué)習(xí)過(guò)perl,我不知道perl里替換字符串是不是這么干的,但sed是這么干的,所以如果你有sed或者tr基礎(chǔ),很容易明白,這個(gè)替換和sed里的正則語(yǔ)法是一模一樣的。

2) 把所有文件名內(nèi)含有大小字母的,修改為小寫(xiě)字母。

1

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

依然和sed的替換語(yǔ)法一樣,不用多解釋,如果看不懂的話,可以系統(tǒng)學(xué)習(xí)一下sed先。

還有幾個(gè)比較實(shí)用的例子:

批量去掉文件名里的空格

Linux文件名本來(lái)是不支持空格的,不知道什么時(shí)候允許了,當(dāng)然,在命令行調(diào)用文件的時(shí)候,空格是很有問(wèn)題滴,比如你 原來(lái)可以直接  mv  oldfile  newfile  但有空格就不行了 , 得加雙引號(hào): mv "oldfile"  "newfile" 或者用反斜杠轉(zhuǎn)移  [] ,這樣還好,但如果你直接把含有空格的圖片名引入 Latex文檔,Latex生成pdf的時(shí)候會(huì)直接打印出文件名,之前這個(gè)問(wèn)題苦惱了我很久,我生成的pdf怎么老是出現(xiàn)文件名呢?后來(lái)才發(fā)現(xiàn)原來(lái)是文件名內(nèi)含有空格的問(wèn)題!windows系統(tǒng)下生成的文件名是天生含有空格的,雖然很討厭,但有些惠普掃描儀生成的圖片默認(rèn)就加入了空格,沒(méi)有辦法,只好去掉他,在系統(tǒng)研究rename命令前,我是用 mv 去除空格的。

網(wǎng)上流程的兩個(gè)去空格的版本:

1) tr 版:

1

2

3

4

5

6

7

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

while read name; do

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

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

mv "$name" $na

fi

done

這個(gè)版本以前我一直用的,不知道哪個(gè)網(wǎng)上搜刮來(lái)的,當(dāng)時(shí)還沒(méi)有系統(tǒng)的學(xué)習(xí)過(guò) tr/sed/awk命令。

注解一下,很好理解, find . type f -name "* *" -print 這一句是查找當(dāng)前目錄下所有類型為普通文件的 并且名字之中含有空格的文件,并打印出來(lái),其實(shí) find默認(rèn)就是打印的 這個(gè) -print 多余了,然后 通過(guò)管道傳輸給 while 循環(huán)讀取,文件名放到 name 變量里,用 tr 命令 替換空格為 下劃線。 下面判斷如果執(zhí)行后的名稱不相同,使用 mv 命令重命名。但這個(gè)if判斷可有可無(wú),因?yàn)閒ind已經(jīng)查詢了所有文件名中含有空格的,那么經(jīng)過(guò) tr 命令后, $na變量肯定不等于 $name 變量的。

所以這段代碼可以簡(jiǎn)化:

1

2

3

4

5

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

while read name; do

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

mv "$name" "$na" 

done

tr 可以看著是 sed 的一個(gè)精簡(jiǎn)版本,tr 用下劃線來(lái)替換空格。

還有一個(gè) 是 sed 版本實(shí)現(xiàn):

1

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

里的 sed表達(dá)式還可以這樣寫(xiě):

1

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

不過(guò)記住,sed里的出現(xiàn)一次或多次的加號(hào)是需要添加反斜杠的。即:+

這樣就可以了。

好了,這兩種辦法都太他媽羅嗦了,看看rename實(shí)現(xiàn)吧:

1

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

OK就這么簡(jiǎn)單。

方括號(hào)內(nèi)的空格可以用 [:space:]代替,

即可以寫(xiě)成 's/[[:space:]]+/_/g'

這里注意,rename 采用的是標(biāo)準(zhǔn)perl正則語(yǔ)法,所以無(wú)須將 加號(hào)轉(zhuǎn)變?yōu)榉葱备芗犹?hào) 。即 + 不能修改為 +,否則替換失敗。

還有幾個(gè)好玩的例子:

比如統(tǒng)一在文件頭部添加上 hello

1

rename         's/^/hello/'       *

統(tǒng)一把.html擴(kuò)展名修改為 .htm

1

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

統(tǒng)一在尾部追加 .zip后綴:

1

rename          's/$/.zip/'      *

統(tǒng)一去掉.zip后綴:

1

rename          's/.zip$//'      *

規(guī)則化數(shù)字編號(hào)名,比如 1.jpg, 2.jpg ..... 100.jpg , 現(xiàn)在要使文件名全部三位即 1.jpg .... 001.jpg

運(yùn)行兩次命令:

1

2

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就研究了這么多,暫時(shí)不知道如何在rename中引入動(dòng)態(tài)變量,比如 $i++

我測(cè)試過(guò) i=0;  rename -n "s/^.*$/$((++i))/"   *  執(zhí)行后i被自增了1,并非想我想像中那樣,可以在每操作一個(gè)文件自增一,猜想可能是因?yàn)閞ename批量實(shí)現(xiàn)的,導(dǎo)致++i只計(jì)算一次!

-n 用來(lái)測(cè)試rename過(guò)程,并不直接運(yùn)行,可以查看測(cè)試效果后,?后再運(yùn)行。


提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

這條文檔是否有幫助解決問(wèn)題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問(wèn)題: