把文件名當(dāng)中含有特殊字符[.\]的文件刪除的方法
更新時(shí)間:2007年08月05日 12:10:08 作者:
如果這個(gè)「特殊字元」是 '/',請(qǐng)?zhí)竭@題的結(jié)尾;如果這個(gè)特殊的字元是
一個(gè) ' 或者控制字元或者中文字,請(qǐng)繼續(xù)往下讀。
典型的解法是:
rm -i some*pattern*that*matches*only*the*file*you*want
這樣子的話 rm 會(huì)在要?jiǎng)h除符合你給的條件的檔案前,要你確定,不
過(guò)若你的 shell 會(huì)將每個(gè)字元的第八個(gè) bit 變成零,那以中文作檔
名的檔案可能就刪除不掉了!
與
rm -ri .
這樣子的 rm 會(huì)刪除目前目錄下的所有檔案,而在刪除一個(gè)檔案之
前會(huì)問(wèn)你是否要?jiǎng)h除此檔。不過(guò)很不幸的,并非每一個(gè)版本的 rm 都
能這么用。再者,就算能用的話,這么做的話會(huì)把目前所在目錄的所
有子目錄都找進(jìn)去,可能要用 "chmod a-x" 避免使子目錄無(wú)法搜尋才
能避免可怕的后果。要做 "rm -r" 或含有萬(wàn)用字元的 "rm" 前請(qǐng)先深
呼吸,搞清楚自己是在做什么!
與
find . -type f ... -ok rm '{}' \;
"..." 是一堆用以辨識(shí)檔案名稱的述詞,譬如在找出一有問(wèn)的檔案的
inode 為何后,用
find . -num 12345 -ok rm '{}' \;
或
find . -inum 12345 -ok mv '{}' new-file-name \;
刪除或改名。 選項(xiàng) "-ok" 是告訴 find 要執(zhí)行指令前先要求你確認(rèn)
。若你能確定所下的指令沒(méi)有問(wèn)題,或者怕所要處理檔案有奇怪的字
元印出來(lái)會(huì)使螢?zāi)粊y七八糟,那用選項(xiàng) "-exec" 就不會(huì)先要求你的確
認(rèn)。
那當(dāng)檔案名稱里含有 '/' 時(shí)要怎么辦呢?
這類檔案是很特別的情形,并且只會(huì)因?yàn)?nbsp;kernel 的 bug 而發(fā)生(通
常是在寫(xiě) NFS 的時(shí)候,沒(méi)有把從遠(yuǎn)端機(jī)器來(lái)的檔案名稱中不合規(guī)定的
字元過(guò)濾掉)。我們第一件要做的事情就是,試著去了馕裁湊飧?nbsp;
問(wèn)題會(huì)如此奇怪。
UNIX 的目錄其實(shí)就只是單純的檔名和 inode number 的成對(duì)組合。
舉例來(lái)說(shuō),目錄包含了如下的資訊:
filename inode
file1 12345
file2.c 12349
file3 12347
理論上揮?nbsp;'/' 和 '\0' 兩個(gè)字元不能用在檔案名稱中,
因?yàn)樗鼈冇幸韵碌奶厥庥猛荆?nbsp;
'/' :用來(lái)分隔目錄名稱及檔案名稱。
'\0' :用來(lái)當(dāng)檔名的終結(jié)字元。
非常、極端、很不幸的,某些廠商做出來(lái)的 NFS 在回應(yīng)遠(yuǎn)端機(jī)器的要
求時(shí),會(huì)很白癡地造出含有斜線(/)的檔名。例如,當(dāng)某人在 Mac
或其他非 Unix 機(jī)器透過(guò) NFS 造一個(gè)以日期為名稱的檔案到你的
Unix 中。那么,你的 Unix 目錄看起來(lái)可能就會(huì)像這個(gè)樣子:
filename inode
91/02/07 12357
我們前面所提過(guò)的 'find' 或 'rm' 都無(wú)法刪除這個(gè)檔案,因?yàn)檫@些或
其他的 Unix 程式都會(huì)強(qiáng)制把 '/' 當(dāng)作前述的分隔字元解釋。
其實(shí),任何一般的程式都會(huì)試著做 unlink("91/02/07"),而這對(duì)
kernel 來(lái)說(shuō),它的意義是 "unlink 目錄 91 下的子目錄 02 中的檔
案 07",但是,我們并沒(méi)有這樣的檔案,我們有的是一個(gè)名叫
"91/02/07" 的檔案在目前的目錄中。這是個(gè)極細(xì)微但極重要的區(qū)別。
這時(shí)該怎么辦呢?首先回到產(chǎn)生這種亂七八糟檔名的 Mac,試試
看 NFS daemon 要不要讓你改成不含 '/' 的檔名。如果不行,那就得
找你的系統(tǒng)管理者幫忙了。請(qǐng)他試試以下幾種方法之一:
1. 用 "ls -i" 找出檔案的 inode number,umount 掉這個(gè)
file system 然后以 "clri" 將這個(gè) inode 清除,然后
祈求“fsck" 的成功。這個(gè)作法會(huì)刪除這亂七八糟檔名的
檔案。
2. 若還想保存這個(gè)檔案的資料,試試以下的做法:
-在那亂七八糟檔名的檔案所在之目錄的親目錄底下建一
個(gè)子目錄,將舊的目錄下能搬動(dòng)的檔案都搬到新的目錄
里。
-以 "ls -id" 取得舊目錄的 inode number
-unmount 掉這個(gè) file system, 用 "clri" 清掉那個(gè)
目錄的 inode
-"fsck" 那個(gè) file system
-從新 mount 上那個(gè) file system
-將新的目錄改名為舊的目錄名
-從 lost+found 下找回那個(gè)檔案,改個(gè)好名字,放回原
來(lái)的目錄。
我的測(cè)試過(guò)的,一般文件的建立方法
cmd下 創(chuàng)建的方法:md jb51..\
刪除的方法:rd jb51..\
一個(gè) ' 或者控制字元或者中文字,請(qǐng)繼續(xù)往下讀。
典型的解法是:
rm -i some*pattern*that*matches*only*the*file*you*want
這樣子的話 rm 會(huì)在要?jiǎng)h除符合你給的條件的檔案前,要你確定,不
過(guò)若你的 shell 會(huì)將每個(gè)字元的第八個(gè) bit 變成零,那以中文作檔
名的檔案可能就刪除不掉了!
與
rm -ri .
這樣子的 rm 會(huì)刪除目前目錄下的所有檔案,而在刪除一個(gè)檔案之
前會(huì)問(wèn)你是否要?jiǎng)h除此檔。不過(guò)很不幸的,并非每一個(gè)版本的 rm 都
能這么用。再者,就算能用的話,這么做的話會(huì)把目前所在目錄的所
有子目錄都找進(jìn)去,可能要用 "chmod a-x" 避免使子目錄無(wú)法搜尋才
能避免可怕的后果。要做 "rm -r" 或含有萬(wàn)用字元的 "rm" 前請(qǐng)先深
呼吸,搞清楚自己是在做什么!
與
find . -type f ... -ok rm '{}' \;
"..." 是一堆用以辨識(shí)檔案名稱的述詞,譬如在找出一有問(wèn)的檔案的
inode 為何后,用
find . -num 12345 -ok rm '{}' \;
或
find . -inum 12345 -ok mv '{}' new-file-name \;
刪除或改名。 選項(xiàng) "-ok" 是告訴 find 要執(zhí)行指令前先要求你確認(rèn)
。若你能確定所下的指令沒(méi)有問(wèn)題,或者怕所要處理檔案有奇怪的字
元印出來(lái)會(huì)使螢?zāi)粊y七八糟,那用選項(xiàng) "-exec" 就不會(huì)先要求你的確
認(rèn)。
那當(dāng)檔案名稱里含有 '/' 時(shí)要怎么辦呢?
這類檔案是很特別的情形,并且只會(huì)因?yàn)?nbsp;kernel 的 bug 而發(fā)生(通
常是在寫(xiě) NFS 的時(shí)候,沒(méi)有把從遠(yuǎn)端機(jī)器來(lái)的檔案名稱中不合規(guī)定的
字元過(guò)濾掉)。我們第一件要做的事情就是,試著去了馕裁湊飧?nbsp;
問(wèn)題會(huì)如此奇怪。
UNIX 的目錄其實(shí)就只是單純的檔名和 inode number 的成對(duì)組合。
舉例來(lái)說(shuō),目錄包含了如下的資訊:
filename inode
file1 12345
file2.c 12349
file3 12347
理論上揮?nbsp;'/' 和 '\0' 兩個(gè)字元不能用在檔案名稱中,
因?yàn)樗鼈冇幸韵碌奶厥庥猛荆?nbsp;
'/' :用來(lái)分隔目錄名稱及檔案名稱。
'\0' :用來(lái)當(dāng)檔名的終結(jié)字元。
非常、極端、很不幸的,某些廠商做出來(lái)的 NFS 在回應(yīng)遠(yuǎn)端機(jī)器的要
求時(shí),會(huì)很白癡地造出含有斜線(/)的檔名。例如,當(dāng)某人在 Mac
或其他非 Unix 機(jī)器透過(guò) NFS 造一個(gè)以日期為名稱的檔案到你的
Unix 中。那么,你的 Unix 目錄看起來(lái)可能就會(huì)像這個(gè)樣子:
filename inode
91/02/07 12357
我們前面所提過(guò)的 'find' 或 'rm' 都無(wú)法刪除這個(gè)檔案,因?yàn)檫@些或
其他的 Unix 程式都會(huì)強(qiáng)制把 '/' 當(dāng)作前述的分隔字元解釋。
其實(shí),任何一般的程式都會(huì)試著做 unlink("91/02/07"),而這對(duì)
kernel 來(lái)說(shuō),它的意義是 "unlink 目錄 91 下的子目錄 02 中的檔
案 07",但是,我們并沒(méi)有這樣的檔案,我們有的是一個(gè)名叫
"91/02/07" 的檔案在目前的目錄中。這是個(gè)極細(xì)微但極重要的區(qū)別。
這時(shí)該怎么辦呢?首先回到產(chǎn)生這種亂七八糟檔名的 Mac,試試
看 NFS daemon 要不要讓你改成不含 '/' 的檔名。如果不行,那就得
找你的系統(tǒng)管理者幫忙了。請(qǐng)他試試以下幾種方法之一:
1. 用 "ls -i" 找出檔案的 inode number,umount 掉這個(gè)
file system 然后以 "clri" 將這個(gè) inode 清除,然后
祈求“fsck" 的成功。這個(gè)作法會(huì)刪除這亂七八糟檔名的
檔案。
2. 若還想保存這個(gè)檔案的資料,試試以下的做法:
-在那亂七八糟檔名的檔案所在之目錄的親目錄底下建一
個(gè)子目錄,將舊的目錄下能搬動(dòng)的檔案都搬到新的目錄
里。
-以 "ls -id" 取得舊目錄的 inode number
-unmount 掉這個(gè) file system, 用 "clri" 清掉那個(gè)
目錄的 inode
-"fsck" 那個(gè) file system
-從新 mount 上那個(gè) file system
-將新的目錄改名為舊的目錄名
-從 lost+found 下找回那個(gè)檔案,改個(gè)好名字,放回原
來(lái)的目錄。
復(fù)制代碼 代碼如下:
我的測(cè)試過(guò)的,一般文件的建立方法
cmd下 創(chuàng)建的方法:md jb51..\
刪除的方法:rd jb51..\
相關(guān)文章
Bootcfg 配置、查詢或更改 Boot.ini 文件設(shè)置
Bootcfg 配置、查詢或更改 Boot.ini 文件設(shè)置...2007-09-09綁定網(wǎng)關(guān)的批處理及預(yù)留維護(hù)提到
綁定網(wǎng)關(guān)的批處理及預(yù)留維護(hù)提到...2007-08-08批處理bat設(shè)置固定IP地址和自動(dòng)IP地址
這篇文章主要介紹了通過(guò)批處理bat設(shè)置固定IP地址和自動(dòng)IP地址的方法,需要的朋友可以參考下2014-07-07用vbs實(shí)現(xiàn)cmd多命令運(yùn)行功能代碼
用vbs實(shí)現(xiàn)的可以將多個(gè)dos命令運(yùn)行,是個(gè)不錯(cuò)的應(yīng)用2008-05-05