2011年9月17日 星期六

DOS 指令操作: 批次更改檔案名稱


今天的問題是要批次更改一個資料夾內的檔案名稱,首先 Win+R 後輸入 "cmd" 開啟命令提示字元視窗。

切換到目標資料夾
cd 指令是切換"資料夾"名稱,在一般情況下是不改變磁碟目錄的;所以輸入 cd F:\ 只會跳一下 "F:"後又再跳回"C:",這時有兩種方法可以切換磁碟:
1. 直接輸入磁碟代號 ex.) d:
2. cd /d 磁碟代號; 這是告訴提示符切換目錄的同時也改變磁碟 ex.) cd /d d: 

確認目標檔案
如果目標資料夾內混雜著其他不需要修改的檔案,在開始修改檔案名稱之前可以先使用指令過濾一下目標檔案,否則改錯了可能會讓情況不太好收拾。
dir [/w][/b] 檔案名稱/b 使用簡化版本清單,不顯示檔案詳細資料/w 使用寬版簡化清單,不會讓你的卷軸向下跳太多都是檔案名稱的部分,可以使用萬用字元來過濾,"*"代表 零到任意多個隨意字元;"?"代表 零到一個隨意字元,但?做為第一個字母不得為0假設今天我的資料夾內有 a01.txt , a02.wmv , b03.doc , a.txt接著輸入 dir a*.* 將顯示 a01.txt, a02.wmvdir *.txt 將顯示 a01.txt, a.txtdir ?.* / ??.* 將顯示 a.txtdir ?a.* 將顯示 找不到檔案 ("?" 做為第一個字母必為1個字元)dir ?0*.* 除了 a.txt 以外都會被顯示
修改檔案名稱
ren 為 dos 內修改檔案及資料夾名稱的指令。用法為:
ren 目標資料夾或檔案名稱 最終資料夾或檔案名稱
以上面的四個檔案來繼續舉個例:假設今天我的資料夾內有 a01.txt , a02.wmv , b03.doc , a.txt先切換路徑到我的資料夾接著輸入 ren a.txt a04.txt 就會把 a.txt 修改成 a04.txt若要修改大量的檔案就要使用萬用字元的幫忙,輸入 ren a*.* a*.abc就會變成 a01.abc, a02.abc , b03.doc a.abc輸入 ren *.* *.txt 就會將所有的檔案副檔名更改成 txt
修改無規則檔案的第一個字元
在修改一般規則性檔案時,例如整個資料夾連續的
*a##.jpg (*代表任意數量字母,##代表數字)
時,可以下 ren *a*.jpg a*.jpg,即可去掉第一個字母。
但當我們要修改的是無規則檔名第一個字元時,問題就來了。假設今天我的資料夾內有
[001].jpg , [002].jpg , ... , [999].jpg
依照上面的邏輯來說,我們應該是輸入
ren x*.jpg *.jpg
但第二個參數 "*.jpg" 的萬用字元已經包含整個檔案的檔名,所以執行這個指令,是不會有任何變動的。我們還是可以用土法煉鋼下
ren [0*.jpg 0*.jpg、
ren [1*.jpg 1*.jpg
重複9次來完成這個動作,但若想要用一行指令來解決的話就得再加上其他的指令來輔助修改檔案。
for /f "tokens=1* delims=[" %a in ('dir /b [*.jpg') do ren [%a %a
for 的一般用法 FOR %variable IN ('set') DO 命令 [command-parameters]for /f 的用法 FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]
"tokens=1* delims=[ "%a
delims=[ 以 "[" 做為目標取樣的分隔符號,分隔符號將不會被記入。tokens=1* 以 delims 指定的符號分隔並取第一個部分與之後的所有字元,等同tokens=1,*for /f 內的token參數預設為1,所以若只要取第一部分可省略tokens=2,3* 以 delims 指定的符號分隔並取第一,二個部分與之後的所有字元
%a 指定取樣後的變數名稱
in ('dir /b [*.jpg')
單引號內的指令限制我要改變的檔案名稱範圍
do ren [%a %a
對每個 in(set) 內的檔案執行 do 後的指令。在這裡如果下 do ren [*.* %a 會使檔案錯亂
若只是要修改第一個字元的話以上的指令可以簡化成 
for /f "delims=[" %a in ('dir /b [*.jpg') do ren [%a %a 
若是要修改檔案中的特定字元,就要加上tokens 的幫助 
for /f "tokens=1* delims=x" %a in ('dir /b *x*.jpg') do ren %ax%b %a%b 
概念: 以x分開檔名,tokens 取第一與其後之部分後,重新命名將x拿掉

批次檔製作
--以下複製--
@echo off
for /f "tokens=1* delims=x" %%a in ('dir /b *x*.bmp') do ren %%ax%%b %%a%%b
pause
--以上複製--
1. 在目標資料夾新增一個純文字檔案,副檔名更改為 *.bat。 
2. 在此bat檔案上按右鍵選擇編輯,將指令中的x更改為要替換的字元,in 中輸入過濾條件,do 中將x更改為要替換的字元後存檔關閉。 
3. 執行。若資料重要可以先創建一個實驗資料夾看看修改的結果是否正確再行套用。



2.
@echo off
for %%a in (*.bmp) do (
set "file=%%a"
call ren "%%a" "%%file:x=%%")

參考引用:
CD、MD、RD、DIR 的使用
REN、TYPE、ATTRIB 的使用
for指令太強了 - for 更深的進階應用
教學 - DOS技巧100例 - DOS指令與實例操作

16 則留言:

  1. 請問若我想要將D:\ 裡面非 *.xls 的檔案改成 *_TEST.xls
    但若原本檔案已經是 *_TEST.xls 就不要修改檔名 , 這程式要該如何寫呢?

    回覆刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 請問我要把123.pdf (C).TXT改成123_Color.txt, 這程式要該如何寫呢?

    回覆刪除
    回覆
    1. 我找到答案如下:
      Ren "123.pdf (C).txt" 123_Color.txt

      刪除
  4. 或是用以下也可以
    Ren "???.pdf (C).txt" ???_Color.txt

    回覆刪除
  5. 請教如何擷取檔名「ZXYA0004_PCD0801_1080102_080409.pdf」中的「180102」,並更名為「180102.pdf」呢?謝謝!

    回覆刪除
  6. 請問如何將多個檔案名稱前面加上固定的字母或數字?例如11.jpg,22.jpg,33.jpg,...加上a9變成a911.jpg,a922.jpg,a933.jpg,...,可以提供程式碼嗎?

    回覆刪除
    回覆
    1. 我處理IMG_E1234.JPG>IMG1234.JPG的方法
      請參考看看。

      for /f "tokens=2* delims=E" %a in ('dir /b *E*.JPG') do ren *E%a IMG_%a

      For迴圈/f讀取從dir此目錄中/b所有檔名中有E的.JPG檔,delims=E檔名中以E為定位tokens=2*從第二位開始的所有值並存到%a

      此時%a為數字.檔名(此案的話就是1234.JPG)

      do進行ren更名*E%a所有裡面有E1234.JPG的檔案成為IMG_1234.JPG

      刪除
  7. 在檔案名稱前面加上字母或數字似乎不適用於長檔名,有解否?

    回覆刪除
  8. 若我有很多不規則名字檔案需在前面加” cv - “要怎打?

    回覆刪除
  9. 若我有很多不規則名字檔案需在前面加” cv - “要怎打?

    回覆刪除
  10. 若我需在不規則的檔案名字最開始加上字元不是取代能做到嗎

    回覆刪除