电竞比分网-中国电竞赛事及体育赛事平台

分享

CMD實戰(zhàn)系列之一 - 批量重命名

 kaichun 2007-05-30
需求:

只用cmd命令,將某目錄及其子目錄下所有文件都加上bak后綴。

分析:

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

實戰(zhàn)一:豪情萬丈

按照上面的分析,熟練點的很快能寫出:

代碼:
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的大都聽過這樣一句武林秘籍:學(xué)會for,cmd就無敵了。for是cmd命令中的九陰真經(jīng),此言絕不虛傳。我們一起來看看這本威力無窮的經(jīng)書吧:
代碼:
for /? > forhelp.txt
獲取經(jīng)書的辦法我一般不告訴其他人,上面的命令據(jù)說RP不好時會引入魔道。如果RP好,請憋著激情澎湃的心情,慢慢將經(jīng)書打開,映入眼簾的是欲練此功......
引用:
Runs a specified command for each file in a set of files.
上面這個官方說明其實有點狹隘,for不僅僅能對文件集操作,只要是某個集(set),for就能遍歷處理。
for的基本用法是:
引用:
FOR %variable IN (set) DO command [command-parameters]
詳細(xì)解釋我就不多說了,經(jīng)書里說得非常清楚。這里稍微解釋下幾個“特殊”用法:

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的含義倒是很清楚,經(jīng)書一點都不含糊。

FOR /F ["options"] %variable IN (set) DO command [command-parameters]
/F中的F是File,這是用得最多的也是最復(fù)雜同時最有用的一招,經(jīng)書的解釋也很詳細(xì)了,我想來想去,沒想到值得補充的,想說一點的是,/F(ile)和file-set中的File是廣義的,for不僅僅用于文件集,所有字符串集其實都可以用for處理。此外,/F選項加上后,(set)可以是普通的file-set,還可以是"string" or ‘command‘;如果options中有usebackq,(set)中的表示又略有不同。

其它詳細(xì)解釋,就不多說了,所謂師傅領(lǐng)進(jìn)門(自詡為師傅,汗一個先,hitme師爺別生氣).....

好,九陰真經(jīng)閱讀完畢,回到我們要討論的問題。
來看看 for /F in %i (‘dir /A:-D /S /B‘) do move %i %i.bak 就很容易懂了,‘dir /A:-D /S /B‘是命令,得到所有文件列表,for 用來遍歷,對于列表中的每一行,存儲到 %i 變量,然后執(zhí)行 move %i %i.bak 重命名,大功告成。

小結(jié):

1. 在實戰(zhàn)一中,我們學(xué)會了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

實戰(zhàn)二:莫撞墻

高高興興的把上面的解決方案交給了老板(不僅提供了,而且提供了兩個,老板總該滿意了吧),誰料屋不漏卻遭連環(huán)雷,舒舒服服的決定逛會CCF和DRL水區(qū)之時,電話鈴聲大作,老板發(fā)火了:“搞什么搞,兩個命令運行了,文件后綴一個也沒加上,糊弄我是吧,不趕快搞定扣你績效......”

暈啊,汗都來了,什么破老板,是不是不會開cmd窗口?上面的命令怎么會有錯呢?萬般無奈,遠(yuǎn)程協(xié)助老板,不運行不知道,一運行也不嚇一跳:

引用:
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.
......

汗啊,寒窗二十余年,苦練九陰神功,最后居然敗在死背四淫賊手上,數(shù)千年祖輩留下來的光榮顏面就此毀于一旦,地面無縫我想鑿啊,天堂無路我欲飛......

汗流浹背之時,快速搞定:

方案一修正版:
代碼:
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"

小結(jié):死背四(Space)淫賊無處不在,一定要小心小心又小心。

既是總結(jié)也是前言:做而后思之,可以為師矣

喜歡折騰Windows系統(tǒng)的,或多或少都接觸過dos命令。雖然已經(jīng)有很多強大易用的GUI程序,但我始終相信,dos命令以其簡潔豐富、靈活多高效的特性將會永遠(yuǎn)存在而且一直被人使用。

cmd命令是dos命令中的基石,如果有精力,我會一并介紹其他dos下常用的命令行小工具,包括for win32版的ls、grep等。這些小工具強大的生命力,時常讓我感到驚訝。

打算寫的這個實戰(zhàn)系列,對自己來說是一個鞏固提高的過程,同時很希望這些文章能對大伙的實際工作有所幫助,哪怕能節(jié)約你那么一點點時間,那也是我的愿望。

做而后思之,可以為師矣。我相信任何一個人,只要愿意在具體操作之后,去追尋思考為什么,就都可以成為CMD專家。希望我的這篇文章能拋磚引玉^o^

最后很感謝CMD王子hitme以及集百長于一身的高人asap, 從你們的文章以及回復(fù)中,受益匪淺 ^o^

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多