rename 是 Linux 批次重命名利器,功能比 mv 強大得多。但系統可能預裝兩種完全不同的版本——C 語言版(傳統)與 Perl 版(現代、支援正則),語法互不相容。本文教您快速辨識版本、掌握兩種語法,並提供實戰範例讓您輕鬆處理大量檔案改名需求。
man rename
查看手冊頁首行:
RENAME (1) Linux Programmer's Manual → C 語言版RENAME (1) Perl Programmers Reference Guide → Perl 版現代發行版(Ubuntu 18.04+、Debian 10+、Fedora 30+、Arch 等)預設多為 Perl 版;舊版 Red Hat/CentOS 可能仍是 C 版。
rename 舊字串 新字串 檔案...
三個固定參數:from、to、file...。只能做固定字串整體替換,不支援正則、不支援遞增編號。
# 將所有 log 開頭的檔案改為 history 開頭
rename log history log*
# 批次將 .jpeg 副檔名改為 .jpg
rename .jpeg .jpg *.jpeg
結果:log001.txt → history001.txt、photo.jpeg → photo.jpg。每個檔案套用相同的單一替換規則。
rename 'perl正則運算式' 檔案...
兩個參數:第一個是 Perl 運算式(通常用 s/搜尋/替換/ 或 y/字元對應/),第二個是檔案清單。支援完整 Perl 正則功能(捕獲群組、條件、代碼執行等)。
| 運算式 | 功能 | 範例 |
|---|---|---|
s/搜尋/替換/ | 單次替換 | s/\.bak$// 移除 .bak 尾綴 |
s/搜尋/替換/g | 全域替換 | s/ /_/g 所有空格改底線 |
y/A-Z/a-z/ | 字元轉換(如 tr) | 大寫改小寫 |
$_ = sprintf("img%03d.jpg", $i++) | Perl 代碼重命名 | 按序號重命名 img001.jpg... |
# 1. 移除所有 .bak 尾綴
rename 's/\.bak$//' *.bak
# 2. 檔名大寫改小寫
rename 'y/A-Z/a-z/' *
# 3. 移除檔名中的空格(Windows 檔案常見問題)
rename 's/ /_/g' *
# 4. 依序編號重命名:img001.jpg, img002.jpg...
i=1; rename 's/.*/sprintf("img%03d.jpg", $i++)/e' *.jpg
# 5. 在檔名前加上日期前綴
rename 's/^/20240115_/' *
# 6. 將 IMG_1234.JPG 統一改為 img_1234.jpg(大小寫+前綴)
rename 's/^IMG_(\d+)\.JPG$/img_$1.jpg/i' *.JPG
-n 或 --dry-run 只顯示會怎麼改,不實際執行(Perl 版支援)。i 修飾符忽略大小寫。find -print0 | xargs -0 rename ... 處理含空格、換行的檔名。find . -type f -name '*.txt' | rename 's/foo/bar/'(注意輸入為檔案路徑)。perl-rename 或 file-rename(Debian/Ubuntu 套件名),避免版本衝突。掌握 rename(特別是 Perl 版),配合 find、xargs,就能在終端機幾秒內完成原本需寫腳本甚至手動點選的大量改名任務,是 Linux 管理者的必殺技之一。