mv 只能單個重命名,批量改名常寫 for 循環。其實 rename (Perl 版) 一條命令搞定 90% 場景,支持正則替換、序號補零、擴展名統一。
rename [選項] 's/舊模式/新模式/' 文件列表
# 或傳統語法
rename 字符串1 字符串2 文件列表
| 參數 | 說明 |
|---|---|
| -v, --verbose | 顯示重命名詳情 |
| -n, --no-act | 試運行,不實際修改 |
| -f, --force | 強制覆蓋同名文件 |
| -e, --expr | Perl 表達式 (可多次使用) |
hs_ok_all_* → hs_*rename 's/^hs_ok_all_/hs_/' hs_ok_all_*
# 結果:hs_ok_all_200911.txt → hs_200911.txt
.htm → .htmlrename 's/\.htm$/.html/' *.htm
foo1..foo9 → foo01..foo09rename 's/^foo(\d)$/foo0$1/' foo?
# 或
rename 's/^foo(\d+)$/sprintf("foo%03d",$1)/e' foo*
# 全小寫
rename 'y/A-Z/a-z/' *
# 全大寫
rename 'y/a-z/A-Z/' *
rename 's/_bak//' *_bak.txt
find . -name "*.log" -exec rename 's/\.log$/.txt/' {} \;
| 版本 | 來源 | 語法 | 功能 |
|---|---|---|---|
| Perl 版 (prename) | util-linux / Perl | rename 's///' file | 正則表達式,功能強大 |
| C 版 (rename.ul) | util-linux | rename str1 str2 file | 簡單字符串替換 |
檢查版本:rename --version。大多數現代發行版默認 Perl 版。
-n 試運行,確認無誤再執行。find -exec 或 xargs。. * ? [ ] ( ) { } ^ $ | \。find -print0 | xargs -0。
# 1. 替換字符串
rename 's/old/new/' *
# 2. 修改擴展名
rename 's/\.jpg$/.png/' *.jpg
# 3. 添加前綴
rename 's/^/prefix_/' *
# 4. 添加後綴
rename 's/$/_suffix/' *
# 5. 刪除前 4 字符
rename 's/^.{4}//' *
# 6. 試運行
rename -n 's/foo/bar/' *