rename 批量修改文件名

From:http://www.javashuo.com/article/p-dfwdewiw-v.htmlhtml

rename與mv的區別就是mv只能對單個文件重命名,而rename能夠批量修改文件名linux

linux中的rename有兩種版本,一種是C語言版的,一種是Perl版的,如何區分系統裏的rename是哪一個版本的,能夠經過一下方式:正則表達式

輸入man rename 看到第一行中包含Linux Programmer’s Manual時,這就是C語言版本的,若是第一行中包含 Perl Programmers Reference Guide,則就是Perl版本的。ide

Perl語言版本的rename用法

perl版本的rename同sed中的語法相似,rename perl正則表達式 待處理的文件

替換 rename 's/.rtv.txt.kml/.kml/' *.kml 或者rename 's/foo0/foo/' foo0[2]* 將foo02開頭的文件名中的foo0替換爲fooui

刪除某些字符  rename 's/gps_//' *.kml或者rename 's/.bak$//' *.bakspa

其中,?可替代單個字符*可替代多個字符,三種通配符能夠一塊兒結合使用。命令行

實例:htm

把全部文件名內含有大小字母的,修改成小寫字母:rename 'y/A-Z/a-z/' *.txt 對象

linux中容許文件名中包含空格,但文件名中有空格時,在命令行調用文件時要將文件名用雙引號引發來或者對空格進行轉義才能行,去除文件名中空格的實現命令有如下兩種方式:blog

    1. find . -type f -name "* *" -print |while read name; do mv "${name}" `echo "${name}"|sed "s/[ ]\+/_/g"`;done
    2. rename "s/[ ]+/_/g" *
    • 其中[ ]+表示空格出現一次或屢次,空格能夠用[:space:]代替,該命令可替換爲[[:space:]]+
    • 在sed中須要將+轉義,但在rename中不能轉義,由於rename 採用的是標準perl正則語法
    • 從命令中可以看到sed與rename的區別,rename處理的是*所能匹配到的該目錄下的全部文件,它將全部文件名做爲處理的對象,而命令sed 處理邏輯 文件名時,sed 處理的是文件內容,因此只能經過echo "文件名"|sed "s/[ ]\+/_/g的方式才能處理文件名

  rename 's/^/hello/' * 統一在文件頭部添加上hello 

  rename 's/.html$/.htm/' * 統一把.html擴展名修改成.htm

  rename 's/$/.zip/' * 統一在尾部追加.zip後綴:

  rename 's/.zip$//' * 統一去掉.zip後綴

  規則化數字編號名,好比1.jpg, 2.jpg ..... 100.jpg , 如今要使文件名所有三位即1.jpg .... 001.jpg,運行兩次命令:

  1. rename 's/^/00/'  [0-9].jpg # 這一步把1.jpg ..... 9.jpg 變幻爲001.jpg .... 009.jpg
  2. rename 's/^/0/' [0-9][0-9].jpg # 這一步把10.jpg ..... 99.jpg 變幻爲010.jpg ..... 090.jpg

C語言版本rename的用法

     rename 原字符串 需改爲的字符串 須要修改的文件

  rename 'test' 'tast' *.txt,將文件名中的test改成tast

  rename .jpeg.jpg *.jpeg  修改文件的擴展名

總的來講:rename C語言版本所能實現的功能:批量修改文件名,結果是每一個文件會被相同的一個字符串替換掉!也就是說,沒法實現諸如循環 而後按編號重命名等

應用實例:

1.批量修改文件前綴

場景:folder A中有a.rtv b.a.c.imu a.t.gps a.y.ew.imu等等,想要將這些文件的文件名統一爲test,後綴保持不變

通常的思路:

遍歷folder,依次獲取文件 ---> 獲取文件後綴${pre}--->使用mv ${file}  test.${pre}

該方法中沒有文件都要獲取後綴再執行mv命令,灰常複雜

rename方法:rename 's/.*\./test./' *便可,其中.*\.中.*表明匹配屢次單個字符,\.表明對點進行轉義。

相關文章
相關標籤/搜索