1. 程式人生 > >批量修改檔名(find & rename & sed)

批量修改檔名(find & rename & sed)

(一) Linux檔名轉windows檔名

在Linux下對於檔案的命名基本沒有多大限制(不能有”/”),但是在windows下,檔名不允許有
\ / : * ? " < > |,所以如果需要複製檔案的時候,在Linux下面命名正確的檔案就需要檢查命令規則,看是否滿足windows的命名規則,主要是檢查檔名時候有\ / : * ? " < > |這幾個字元,然後將該字元轉換為’-’。

這裡介紹一個功能比較強大的重新命名命令rename:

rename命令的格式:
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
-v, --verboseVerbose: print names of files successfully renamed.
-n, --no-actNo Action: show what files would have been renamed.
-f, --forceForce: overwrite existing files.

簡單的rename使用命令:
字母的替換
rename "s/AA/aa/" *             //把檔名中的AA替換成aa
修改檔案的字尾
rename "s/.html/.php/" *     //把.html 字尾的改成 .php字尾
批量新增檔案字尾
rename "s/$/.txt/" *             //把所有的檔名都以txt結尾
批量刪除檔名
rename "s/.txt//" *               //把所有以.txt結尾的檔名的.txt刪掉

(1)         使用rename命令:由於雙引號和”\”在rename命令中會被shell特殊功能擴充套件,所以暫時還不能替換這兩個

find path -type f | xargs rename 's/[:*?<>|]/-/g'

(2)         使用sed命令:由於雙引號和”\”在sed命令中會被shell特殊功能擴充套件,所以暫時還不能替換這兩個(注意由於使用sh的時候會建立很多新程序效率較低)

find path -type f |

 sed -n 'h;s#.*/##;s#[:*?<>|]#-#g;ta; a:G;s#^\([^\n]*\)\n\(.*/\)\([^/]*\)$#mv \2\3 \2\1#' | sh –x

(二)批量修改同格式的檔名

如果要修改的檔名的格式一致,可以使用

(1)            find ./ -name xxx -exec mv {} {}.xx \

這個是最簡單的了,但是有一點不好的是隻能在後面加個字尾

(2)            find ./ -name xxx | xargs -I mv {} {}.xx

(3)            find ./ -name XXX | awk ''{printf("mv %s \t %s \n",$1,$1)}'' | sh

awk 裡面可以自由發揮 單純的對檔名處理來說 還不是awk的強項(注意由於使用sh的時候會建立很多新程序效率較低)

(4)            find ./ -name xxx | sed ''s/XXX/mv xxx xxxxx/'' | sh

(注意由於使用sh的時候會建立很多新程序效率較低)

(5)            ls | sed 's/.old$//'|xargs -I {} mv {}.old {}

建立程序的消耗是很大的,所以能用xargs的時候就不要用 |sh