如何大量更改檔名?
到iT邦幫忙

jako(iT邦初學者9級)發問:
因工作需要常要更改大量檔案名稱,例如:abc_06_(10000001).txt轉成10000001.txt,請問有什麼較簡單的辦法嗎?

dream(iT邦高手10級):
以下批次檔假設格式是固定的,如果檔名第八個字元非"("及第17個字元非")",則不會更名。

@ECHO OFF
SET Flag=0
SETLOCAL ENABLEDELAYEDEXPANSION
for /R C:\TEMP\ %%j in (*) do (
SET FileName=%%~nxj
IF "!FileName:~7,1!" EQU "(" (
IF "!FileName:~16,1!" EQU ")" (
REN %%~fj !FileName:~8,8!!FileName:~17,4! 2>null

IF !ERRORLEVEL! EQU 0 ECHO %%~nxj 變更為 !FileName:~8,8!!FileName:~17,4!

IF !ERRORLEVEL! EQU 1 (

ECHO %%~nxj 未變更請檢查是否已有!FileName:~8,8!!FileName:~17,4! 檔案。

ECHO 或是%%~fj已不存在。

PAUSE
ECHO.
)
)
)
IF "!FileName:~16,1!" NEQ ")" SET Flag=1
IF "!FileName:~7,1!" NEQ "(" SET Flag=1

IF !Flag! EQU 1 ECHO %%~nxj 的格式不符預期^^!
SET Flag=0
)
SETLOCAL DISABLEDELAYEDEXPANSION

clcy(iT邦初學者10級):
到網路上找KoyRenamer這工具,它可以直接改名、文字加序號、取代部分文字等,很好用。

tombo(iT邦初學者2級):
for /F %%a in ( 'dir abc*.txt /b' ) do (
for /F "delims=() tokens=2" %%b in ( "%%a" ) do ren "%%a" "%%b.txt"

)這樣子更簡單。第一個迴圈抓原始檔名,第二個迴圈利用 delims 參數,把括號去掉,只截取括號內的數字,這樣即便括號內的數字長度不一,也可以應付!

twtw(iT邦高手10級):
使用UltraEdit要錢,Notepad++不用錢,以下是我用 Notepad++ 的測試過程,最後結果用如圖的設定操作,就可做出所要的批次檔的內容。

http://twtw.blog.ithome.com.tw/gallery/1122/1122-36521.png

每組第一行是「尋找目標」,第二行是「取代為」,第三、四行是結果:
替換成 .txt 前面的全部

(.*).txt
\1
abc_06_(10000001)
abc_08_(10000002)

以 _( 來區分,看第一部份是什麼:

由於()是backreference用的符號,若要區別一般的括號符號,則要用 \( 、 \) 這是需要留意的地方。

(.*)_\((.*)\).txt
\1
abc_06
abc_08

以 _( 區分,看第二部份是什麼:

(.*)_\((.*)\).txt
\2
10000001
10000002
再加上 .txt
(.*)_\((.*)\).txt
\2.txt
10000001.txt
10000002.txt

最外一層括號是 \1,並寫成ren的批次格式:

((.*)_\((.*)\).txt)
ren \1 \3.txt
ren abc_06_(10000001).txt 10000001.txt
ren abc_08_(10000002).txt 10000002.txt


利用正規表達式大量取代檔案名稱的語法

馬上按讚加入iThome FB粉絲團

Advertisement

更多 iThome相關內容