批次修改檔案字尾名

hai503發表於2015-01-13
在Oracle開發維護過程中,時常會匯出資料庫物件的定義,比如table、view。
在藉助Toad、PLSQL Developer等工具匯出時,匯出的view會使用.vw 字尾,table會使用.tab 字尾,等等。總之,不是我們期望的.sql 字尾。
下面介紹一個最簡單、最實用的批次修改檔案字尾名方法:

使用DOS下的ren命令來處理,格式如下:
ren *.原字尾 *.新字尾

1.建立一個bat檔案,在裡面輸入如下程式碼:
@echo off
ren *.vw *.sql
ren *.tab *.sql

2.將該檔案放在要更改字尾名的檔案所在資料夾,點選執行該bat檔案,所有的指令碼都變為.sql字尾。

後記:
在寫這篇筆記之前,俺都用批次更名軟體(XXX rename)來完成以上操作,最近在一個不能下載安裝軟體的域裡工作,查了一下,得此“小巧強大”的方法,好用不貴。

轉貼一篇文章,豐富DOS命令列知識
=============================
使用CMD實現批次重新命名

作者:lifesinger

需求:
只用cmd命令,將某目錄及其子目錄下所有檔案都加上bak字尾。
分析:
1. “只用cmd命令”,意味著不能使用TC等工具;
2. “將某目錄及其子目錄下”,意味著要遍歷整個目錄,dir命令的/S選項,以及for命令的/R選項都有遍歷功能;
3. “所有檔案”,意味著遍歷時不能包括目錄,dir /A:-D 可以排除目錄,只列出檔案;
4. “加上bak字尾”,可以用ren或move命令。

實戰一:豪情萬丈
按照上面的分析,熟練點的很快能寫出:
程式碼:

for /F %i in ('dir /A:-D /S /B') do move %i %i.bak

眨一眼就能看懂的可以跳過下面的段落,直接摁Alt + F4了-.-
不眨眼還看不大懂的不要著急,且聽我慢慢道來^o^(為了弄清楚來龍去脈,下面的解釋會夾雜原始英文釋義)

1. 先解釋 "dir /A:-D /S /B",dir(ectory)命令的作用是
引用:
Displays a list of files and subdirectories in a directory.
DIR [drive:][path][filename] [/A[[:]attributes]] [/b] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]
/A(ttribute):D(irectory) 表示只顯示屬性是目錄的項,D前面加個減號-, 表示非,因此/A:-D就是顯示所有非目錄的項。
/S(ubdirectories), 表示所有子目錄和子目錄下的檔案也都要顯示。
/B(are), 表示顯示最簡單赤裸的資訊就可以了,其它冗餘資訊都不顯示。對於dir命令來說,就是隻顯示長檔名。
好了,說了這麼多,其實很簡單,dir /A:-D /S /B 的作用就是顯示某目錄及其子目錄下的所有檔案列表。可以開啟CMD視窗,親身體驗一下(注意別在C盤根目錄用這個命令呵,檔案太多,會刷半天屏的。若不幸使用,請使勁摁Ctrl + C退出)

2. 來看看 move 和 ren(name) 命令. cmd視窗輸入move /?,一清二楚:
引用:
Moves files and renames files and directories.
To move one or more files:
MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination
To rename a directory:
MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2
/Y中的Y是Yes,-Y就是No了。如果知道有重名的,但依舊想自動覆蓋,就加上/Y選項,這選項和/S(ilence)選項是我最愛用的選項中的兩個,誰用誰知道啊。
ren(ame)命令更簡潔:
引用:
Renames a file or files.
RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.
Note that you cannot specify a new drive or path for your destination file.
雖然簡潔,但不簡單。首先注意上面的cannot,filename2是不能帶目錄的,就因為這個原因,我更喜歡用move命令來替代rename。
值得提的一點是,cmd下的大部分命令都支援萬用字元的,因此要給某目錄下的檔案加bak字尾,只要ren *.* *.*.bak就可以了,如果ren支援/S(ubdirectories),那麼 ren /S *.* *.*.bak 就能解決最開始那個問題,可恨的是rename太簡潔了,不支援任何選項-.-

3. 接著我們來看看 for /F %i in ('command'). 用cmd的大都聽過這樣一句武林秘籍:學會for,cmd就無敵了。for是cmd命令中的九陰真經,此言絕不虛傳。我們一起來看看這本威力無窮的經書吧:
程式碼:
for /? > forhelp.txt
獲取經書的辦法我一般不告訴其他人,上面的命令據說RP不好時會引入魔道。如果RP好,請憋著激情澎湃的心情,慢慢將經書開啟,映入眼簾的是欲練此功......
引用:
Runs a specified command for each file in a set of files.
上面這個官方說明其實有點狹隘,for不僅僅能對檔案集操作,只要是某個集(set),for就能遍歷處理。
for的基本用法是:
引用:
FOR %variable IN (set) DO command [command-parameters]
詳細解釋我就不多說了,經書裡說得非常清楚。這裡稍微解釋下幾個“特殊”用法:
FOR /D %variable IN (set) DO command [command-parameters]
/D 中的D是Directory, 表示只匹配目錄。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
/R 中的R是Recursive, 表示遞迴遍歷,在這裡就是遍歷所有子目錄。
利用/R遍歷選項,對於頂樓問題,我們還可以得到下面這個解決方案:
程式碼:
for /R %i in (*.*) do ren %i *.*.bak
FOR /L %variable IN (start,step,end) DO command [command-parameters]
/L 中的L我找了半天也無法確定是哪個單詞,很可能是List。/L的含義倒是很清楚,經書一點都不含糊。
FOR /F ["options"] %variable IN (set) DO command [command-parameters]
/F中的F是File,這是用得最多的也是最複雜同時最有用的一招,經書的解釋也很詳細了,我想來想去,沒想到值得補充的,想說一點的是,/F(ile)和file-set中的File是廣義的,for不僅僅用於檔案集,所有字串集其實都可以用for處理。此外,/F選項加上後,(set)可以是普通的file-set,還可以是"string" or 'command';如果options中有usebackq,(set)中的表示又略有不同。
其它詳細解釋,就不多說了,所謂師傅領進門(自詡為師傅,汗一個先,hitme師爺別生氣).....
好,九陰真經閱讀完畢,回到我們要討論的問題。
來看看 for /F in %i ('dir /A:-D /S /B') do move %i %i.bak 就很容易懂了,'dir /A:-D /S /B'是命令,得到所有檔案列表,for 用來遍歷,對於列表中的每一行,儲存到 %i 變數,然後執行 move %i %i.bak 重新命名,大功告成。

小結:
1. 在實戰一中,我們學會了dir、move、rename、for四個命令。
2. 對於頂樓的問題,我們得到了兩個解決方案:

方案一:
程式碼:

for /F %i in ('dir /A:-D /S /B') do move %i %i.bak


方案二:
程式碼:

for /R %i in (*.*) do ren %i *.*.bak



實戰二:莫撞牆
高高興興的把上面的解決方案交給了老闆(不僅提供了,而且提供了兩個,老闆總該滿意了吧),誰料屋不漏卻遭連環雷,舒舒服服的決定逛會CCF和DRL水區之時,電話鈴聲大作,老闆發火了:“搞什麼搞,兩個命令執行了,檔案字尾一個也沒加上,糊弄我是吧,不趕快搞定扣你績效......”
暈啊,汗都來了,什麼破老闆,是不是不會開cmd視窗?上面的命令怎麼會有錯呢?萬般無奈,遠端協助老闆,不執行不知道,一執行也不嚇一跳:
引用:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
......
lifesinger@bpwang ~# for /R %i in (*) do ren %i *.bak
lifesinger@bpwang ~# ren c:\2007.05.21 archivies\公司絕密檔案005號.doc *.bak
The syntax of the command is incorrect.
lifesinger@bpwang ~# ren c:\2007.05.21 archivies\公司絕密檔案007號.doc *.bak
The syntax of the command is incorrect.
......
汗啊,寒窗二十餘年,苦練九陰神功,最後居然敗在死背四淫賊手上,數千年祖輩留下來的光榮顏面就此毀於一旦,地面無縫我想鑿啊,天堂無路我欲飛......
汗流浹背之時,快速搞定:
方案一修正版:
程式碼:

for /F "tokens=*" %i in ('dir /A:-D /S /B') do move "%i" "%i.bak"

注意:必須加上"tokens=*",否則%i只能取到第一個空格前面的部分。


方案二修正版:
程式碼:

for /R %i in (*.*) do ren "%i" "*.*.bak"


小結:死背四(Space)淫賊無處不在,一定要小心小心又小心。
既是總結也是前言:做而後思之,可以為師矣
喜歡折騰Windows系統的,或多或少都接觸過dos命令。雖然已經有很多強大易用的GUI程式,但我始終相信,dos命令以其簡潔豐富、靈活多高效的特性將會永遠存在而且一直被人使用。
cmd命令是dos命令中的基石,如果有精力,我會一併介紹其他dos下常用的命令列小工具,包括for win32版的ls、grep等。這些小工具強大的生命力,時常讓我感到驚訝。
打算寫的這個實戰系列,對自己來說是一個鞏固提高的過程,同時很希望這些文章能對大夥的實際工作有所幫助,哪怕能節約你那麼一點點時間,那也是我的願望。
做而後思之,可以為師矣。我相信任何一個人,只要願意在具體操作之後,去追尋思考為什麼,就都可以成為CMD專家。希望我的這篇文章能拋磚引玉^o^
最後很感謝CMD王子hitme以及集百長於一身的高人asap, 從你們的文章以及回覆中,受益匪淺 ^o^

============================================

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12707874/viewspace-1400452/,如需轉載,請註明出處,否則將追究法律責任。

相關文章