ToolAct工具行動

檔案批次重新命名工具

前後綴、序號、尋找替換、大小寫、副檔名一站搞定,全部在瀏覽器本地處理

新增檔案

拖曳檔案到這裡,或點擊下方按鈕

支援任意類型與數量的檔案,僅在你的瀏覽器中處理,不會上傳

什麼是檔案批次重新命名?

檔案批次重新命名是把一組檔案依規則一次改名的操作。常見場景:相機匯出後的 IMG_1234.JPG 想改成 2026-06-旅行-001.jpg、UI 切圖想統一加 @2x_、報銷單據想依發票日期順序編號。macOS Finder 內建的重新命名雖然支援「尋找與取代」和「名稱+計數器」格式,但不能修改副檔名;Windows 檔案總管只支援簡單的連續序號(PowerToys 的 PowerRename 雖支援正則但需另外安裝);複雜場景往往要靠 ReNamer、Bulk Rename Utility 等本機軟體,或自己寫 PowerShell / shell 腳本。本工具把這些規則——前後綴、序號、尋找替換、大小寫、副檔名——拆成可視化選項,搭配即時預覽和重名偵測,一次確認結果再下載。整個流程都在瀏覽器記憶體中完成,含專案代號、客戶名稱、個人證件名的檔案名也不會離開你的電腦。

使用方法

操作步驟

  1. 把要改名的檔案拖入上傳區,或點擊「選擇檔案」從硬碟選擇,多次新增會追加到清單
  2. 如需調整順序,點清單裡的「依名稱/依大小」排序,或用每列的上下箭頭微調
  3. 在三張設定卡裡設定規則:前後綴、尋找替換、序號、大小寫、副檔名
  4. 右側「新檔名」會即時變化,藍色表示與原名不同,紅色表示與其他檔案重名
  5. 確認無誤後點「下載此檔案」單獨儲存,或「打包下載 ZIP」一次拿走全部

規則套用順序

  • 先用「替換為統一名稱」覆蓋原名(留空則保留),適合「不管原名是什麼,全部統一為 photo + 序號」這類場景
  • 然後執行「尋找/替換」,僅作用於基礎名,不影響副檔名
  • 接著插入序號,可放在最前、最後或完全替換基礎名
  • 再加上前綴和後綴,包裹在最外層
  • 最後做大小寫轉換和副檔名處理,副檔名獨立於基礎名變換

使用場景

相機/手機匯出照片整理DSC_0001.JPG、IMG_1234.JPG 這類相機自帶命名缺乏語意,依時間或主題加上前綴和序號能讓相簿一目瞭然。把副檔名轉成小寫還能避免 JPG 與 jpg 混排——從 Windows/macOS(不區分大小寫)同步到 Linux(區分大小寫)時,混排會直接導致存取失敗。
iOS 資產命名規範設計師導出的「icon-home @2x.png」「icon-home @3x.png」可以批量改成「icon-home@2x.png」「icon-home@3x.png」,符合 Xcode Asset Catalog 的命名約定。配合「查找替換」去掉空格,再把基礎名轉小寫,避免大小寫敏感問題導致線上載入失敗。
Android drawable 資源名規範化Android 要求資源名必須全小寫、snake_case、不能以數字開頭。導出的 IcHomeActive.png、ic-home-active.png 之類大小寫或連字號不規範的名字,可以一次性改成 ic_home_active.png:把 `-` 替換成 `_`,基礎名和副檔名都轉小寫。能在編譯報錯前提前規範化。
財務單據/合約依月份歸檔掃描後的 scan001.pdf~scan100.pdf 缺乏歸檔資訊,可設統一基礎名「2026-06-報銷-」加 3 位序號補零,得到「2026-06-報銷-001.pdf」,依檔名排序即依時間排序,搭配壓縮包打包後整月歸檔一氣呵成。
媒體素材統一命名規則剪輯師常需把多機位素材依場次重新命名,例如 GoPro 的 GH010001.MP4 想改成 SceneA_take01.mp4。先用「替換為統一名稱」清掉原名,再啟用序號,副檔名轉小寫,整組素材在 NLE 軟體裡依字母順序排列,便於多機位同步。
去除檔名中的敏感詞或冗餘字元匯出的檔案常帶 (1)、(複本)、_final_v2_FINAL 之類後綴,用「尋找替換」一次清理;含客戶/專案代號的檔案在外發前可批次替換成代號。所有處理都在瀏覽器記憶體中完成,原始檔不上傳,敏感命名同樣可放心處理。
網站靜態資源規範化上傳到 CDN 或物件儲存前,把空格、中文、大寫字母統一處理,避免 URL 編碼踩雷。先「尋找替換」把空格換成橫槓,再「全小寫」,最後副檔名也轉小寫——一次操作就把一組資源轉成 SEO 友善、跨系統安全的命名。

技術原理

整個工具基於瀏覽器的 File API、Blob 和 URL.createObjectURL 實作,所有資料流轉都在記憶體中完成。使用者拖曳或選擇檔案後,瀏覽器把檔案以 File 物件(繼承自 Blob)保存在 JavaScript 堆中,工具只讀取每個檔案的 name 屬性參與重新命名計算,檔案二進位內容(content)保持不變。 重新命名規則依固定順序套用,避免規則互相干擾:先確定基礎名(使用者指定或原檔 base),按 lastIndexOf('.') 把副檔名拆出(首字元為 . 的隱藏檔如 .gitignore 不視為副檔名);然後執行字串 split-join 的尋找替換(不使用正規表達式,避免特殊字元意外觸發比對);接著按零索引 index 計算序號 `String(start + i).padStart(pad, '0')`,序號可作前綴、後綴或完全替換基礎名;再串接前綴和後綴;之後對整個「前綴+基礎名+後綴」一併做大小寫轉換;最後獨立處理副檔名(保持/大寫/小寫/替換)。 重名偵測用一個 Map<string, number> 在預覽時統計每個新檔名的出現次數,超過 1 次的進入 duplicateSet,UI 上以紅色標記。當 duplicateSet 不為空時點擊「打包下載 ZIP」會彈出錯誤 Toast 並中止打包,但原始檔案清單會被保留——調整規則後可以直接再試。這一步在 useMemo 內進行,依賴 [files, opts],規則修改時增量重算,不會因為檔案多而卡頓。 單檔下載使用 URL.createObjectURL(file) 產生一次性 blob URL,寫入暫時 `<a download>` 元素並觸發 click,立即 revokeObjectURL 釋放。打包下載用 JSZip(動態 import,僅在點擊時載入,不影響首屏),把每個 File 的 arrayBuffer() 取出後以新檔名寫入 ZIP 節點,最後 generateAsync({type:'blob', compression:'DEFLATE', compressionOptions:{level:6}}) 產生壓縮包,DEFLATE 是 ZIP 預設演算法,level=6 在壓縮比和速度之間平衡。 所有規則計算複雜度是 O(n),n 為檔案數;JSZip 的壓縮複雜度取決於檔案總位元組數。主流瀏覽器對 File 物件通常採用惰性讀取,不會把檔案內容預讀進記憶體,arrayBuffer() 才會真正把位元組從磁碟讀出來,因此即便加入數千個檔案,預覽階段的記憶體佔用也接近零,只有點擊「打包下載 ZIP」時才會出現記憶體尖峰。

  • lastIndexOf('.') 拆分副檔名時,開頭是 . 且後面沒有更多 . 的檔案(如 .gitignore)會被視為整體基礎名,避免誤把隱藏前綴當副檔名
  • 尋找替換使用 String.prototype.split + Array.prototype.join 而非 String.prototype.replaceAll,防止使用者輸入的 $1、$& 等替換字串裡的特殊符號被意外解釋
  • 序號補零用 padStart(pad, '0');當 pad=0 時直接輸出原始數字,方便不需要等寬對齊的場景
  • 大小寫轉換在前綴和後綴拼接完成後才執行,因此會作用於整個「前綴+基礎名+後綴」字串;副檔名獨立處理,不受影響
  • 重名偵測在 useMemo 內基於 Map 計數,時間複雜度 O(n);UI 用 className 切換紅色高亮,不重新產生 DOM
  • Blob URL 用完立即 URL.revokeObjectURL 釋放,避免在頻繁下載場景下大量保留的物件 URL 持續占用瀏覽器內部資源池
  • JSZip 透過 dynamic import 按需載入,只有點擊「打包下載」才會觸發約 80 KB 的程式碼下載,不影響首屏效能
  • DEFLATE level 6 是瀏覽器端常用的折中值——level 9 僅多 1-2% 壓縮率卻慢 2-3 倍,對圖片/影片/已壓縮檔案幾乎無效

示例

前綴 + 三位序號補零

原檔案: photo.jpg, sunset.jpg, beach.jpg
規則: 前綴=trip2026_,序號起始=1,補零=3,位置=後面
結果:
trip2026_photo001.jpg
trip2026_sunset002.jpg
trip2026_beach003.jpg

完全替換基礎名為序號

原檔案: GH010001.MP4, GH010002.MP4, GH010003.MP4
規則: 基礎名=SceneA_take,序號起始=1,補零=2,位置=後面,副檔名=改為小寫
結果:
SceneA_take01.mp4
SceneA_take02.mp4
SceneA_take03.mp4

尋找替換清理冗餘後綴

原檔案: report_v1_FINAL.docx, summary_v1_FINAL.docx
規則: 尋找=_v1_FINAL,替換為=(空),大小寫=全小寫
結果:
report.docx
summary.docx

副檔名替換

原檔案: index.htm, about.htm, contact.htm
規則: 副檔名=替換為,新副檔名=html
結果:
index.html
about.html
contact.html

前綴 + 後綴 + 大小寫規範化

原檔案: Banner Image.PNG, Hero Photo.JPG
規則: 前綴=web-,查找= ,替換為=-,大小寫=全小寫,副檔名=改為小寫
結果:
web-banner-image.png
web-hero-photo.jpg

常見問題

檔案會上傳到伺服器嗎?

不會。從新增檔案到產生新名再到打包下載,整個流程都在你的瀏覽器裡完成,不存在任何上傳請求。你可以打開瀏覽器開發者工具的 Network 面板驗證。

為什麼我的副檔名(.gitignore、.bashrc)沒有被識別?

工具按「最後一個點之後是副檔名」的規則拆分,但開頭就是點(.gitignore)的隱藏檔視為沒有副檔名,整個 .gitignore 都當作基礎名。這是為了避免錯把隱藏前綴當副檔名處理。

新檔名重複了怎麼辦?

預覽清單會用紅色高亮重名項目,並顯示重名個數。當清單中存在重名時點擊「打包下載 ZIP」會被中止,並顯示錯誤訊息——但檔案清單不會丟失,調整規則後可以直接再試一次。常見解法:啟用序號、調整位數補零、加前後綴。

支援資料夾/巢狀結構嗎?

暫不支援。目前只重新命名單層檔案清單。如果需要帶目錄結構的批次改名,建議先用本工具改名再用「檔案打包壓縮」工具組裝目錄。

尋找替換是否支援正規表達式?

不支援。目前是純字串比對(split-join),是為了避免在替換字串裡誤用 $1、$& 等替換符號。簡單的字面替換覆蓋了絕大多數命名整理場景。

可以處理多少檔案?有大小限制嗎?

理論上沒有數量上限,預覽階段幾乎不耗記憶體。打包階段受瀏覽器單個 Blob 記憶體上限限制:當檔案總和達到幾個 GB 時,可能因為無法分配整塊 Blob 而打包失敗,這種情況下建議把檔案拆成幾批分別打包。

下載的 ZIP 檔名亂碼怎麼辦?

JSZip 預設使用 UTF-8 編碼檔名,現代解壓工具(macOS Archive Utility、Windows 11、7-Zip、WinRAR 5+)都能正確識別。若使用 Windows 自帶舊版檔案總管解壓中文名出現亂碼,請改用 7-Zip 或 Bandizip。

改錯了能撤銷嗎?

重新命名只在下載時才發生——只要你沒點「打包下載 ZIP」或「下載該檔案」,磁碟上的原檔案就不會被改動。預覽階段完全可逆:清空規則、修改規則、移除單個檔案都行。即便已經下載了,也只要重新調整規則、用同樣的來源檔案再下載一次即可。