批量修改檔名(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