如何刪除這個不可磨滅的目錄?
我解壓了一個損壞的 tar 文件,並設法得到了一些我無法刪除的目錄,如果我嘗試刪除它,似乎找不到它,但
ls
顯示它存在,無論是使用 bash 還是使用 python 我都得到類似的行為,除了在我嘗試用 刪除它之後rm -rf
,ls
抱怨它找不到它,然後它列出它(見下文之後rm -rf
)。該find
命令顯示該文件存在,但我仍然想不出刪除它的方法。這是我的嘗試:
在這裡你可以看到
ls
並find
同意我們有一個目錄,rl]$ ls mikeaâ??cnt rl]$ find -maxdepth 1 -type d -empty -print0 ./mikeaâcnt
但我不能刪除它:
rl]$ find -maxdepth 1 -type d -empty -print0 | xargs -0 rm -f -v rm: cannot remove `./mikeaâ\302\201\302\204cnt': Is a directory rl]$ ls mikeaâ??cnt
我可以
cd
做到,但它是空的:rl]$ cd mikeaâ^Á^Äcnt/ mikeaâ^Á^Äcnt]$ ls mikeaâ^Á^Äcnt]$ pwd .../rl/mikeaâcnt mikeaâ^Á^Äcnt]$ cd ../ rl]$ ls mikeaâ??cnt
見下文,這不是一個簡單的文件,而是一個目錄,而且在 它說找不到文件然後直接列出它之後
ls
表現得很有趣:rm -rf
rl]$ rm mikeaâ^Á^Äcnt/ rm: cannot remove `mikeaâ\302\201\302\204cnt/': Is a directory rl]$ rm -rf mikeaâ^Á^Äcnt/ rl]$ ls ls: cannot access mikeaâcnt: No such file or directory mikeaâ??cnt rl]$
所以這是用python的嘗試,找到了文件,但是名稱不能用作可以刪除的名稱:
rl]$ python Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45) [GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> import shutil >>> os.listdir('.') ['mikea\xc3\xa2\xc2\x81\xc2\x84cnt'] >>> shutil.rmtree(os.listdir('.')[0] ) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.6/shutil.py", line 204, in rmtree onerror(os.listdir, path, sys.exc_info()) File "/usr/lib64/python2.6/shutil.py", line 202, in rmtree names = os.listdir(path) OSError: [Errno 2] No such file or directory: 'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'
即使我使用製表符完成,它選擇的名稱也不可用:
rl]$ rm -rf mikeaâ^Á^Äcnt rl]$ ls ls: cannot access mikeaâcnt: No such file or directory mikeaâ??cnt
使用 python 在 bash 中顯示的名稱我得到了這個:
rl]$ rm -rf "mikea\xc3\xa2\xc2\x81\xc2\x84cnt" rl]$ ls ls: cannot access mikeaâcnt: No such file or directory mikeaâ??cnt
我能做些什麼來擺脫這個損壞的目錄嗎?底層文件系統 (NFS) 似乎可以正常工作,並且沒有報告其他問題,並且在損壞的 tar 文件之前我沒有遇到此類問題。
編輯:這是使用
find
自己的-exec
選項來呼叫rm
rl]$ find -maxdepth 1 -type d -empty -exec rm -f {} \; find: `./mikeaâ\302\201\302\204cnt': No such file or directory rl]$ ls ls: cannot access mikeaâcnt: No such file or directory mikeaâ??cnt rl]$
但文件仍然存在,(
ls
抱怨找不到它,但無論如何都會顯示它)第二次編輯:
rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} \; find: `./mikeaâ\302\201\302\204cnt': No such file or directory rl]$ ls ls: cannot access mikeaâcnt: No such file or directory mikeaâ??cnt
行為仍然沒有改變,文件仍然存在
第三次編輯:
rl]$ ls mikeaâ??cnt rl]$ find -maxdepth 1 -type d -empty -exec rm -rf {} + rl]$ ls ls: cannot access mikeaâcnt: No such file or directory mikeaâ??cnt
這個名字似乎比
mikeaâcnt
查看 python 的輸出 更重要mikea\xc3\xa2\xc2\x81\xc2\x84cnt
,這個螢幕截圖:第 4 次編輯:這是使用萬用字元的嘗試:
rl]$ echo * mikeaâcnt rl]$ echo mike* mikeaâcnt rl]$ rm -rf mike* rl]$ ls ls: cannot access mikeaâcnt: No such file or directory mikeaâ??cnt
和我的語言環境:
rl]$ locale LANG=en_US.utf8 LC_CTYPE="en_US.utf8" LC_NUMERIC="en_US.utf8" LC_TIME="en_US.utf8" LC_COLLATE="en_US.utf8" LC_MONETARY="en_US.utf8" LC_MESSAGES="en_US.utf8" LC_PAPER="en_US.utf8" LC_NAME="en_US.utf8" LC_ADDRESS="en_US.utf8" LC_TELEPHONE="en_US.utf8" LC_MEASUREMENT="en_US.utf8" LC_IDENTIFICATION="en_US.utf8" LC_ALL=
第五次編輯:
rl]$ ls -i ls: cannot access mikeaâcnt: No such file or directory ? mikeaâ??cnt
但行為也發生了變化,現在
ls
這樣cd
做:rl]$ ls ls: cannot access mikeaâcnt: No such file or directory mikeaâ??cnt rl]$ cd mikeaâ^Á^Äcnt mikeaâcnt: No such file or directory.
這發生在嘗試刪除之後,我認為這可能是 NFS 問題,正如vinc17在此處的答案之一中所建議的那樣。
第 6 次編輯:這是和的
lsof
輸出ls -a
rl]$ /usr/sbin/lsof mikeaâ^Á^Äcnt lsof: status error on mikeaâ\xc2\x81\xc2\x84cnt: No such file or directory
上面是錯誤的,這裡是正確的
lsof
呼叫:(rl是父目錄)rl]$ /usr/sbin/lsof | grep mike | grep rl tcsh 11926 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl lsof 14733 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl grep 14734 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl grep 14735 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl lsof 14736 mike cwd DIR 0,33 4096 19569249 /home/mike/mish/rl rl]$ rl]$ ls -a ls: cannot access mikeaâcnt: No such file or directory . .. mikeaâ??cnt
第 7 次編輯: move 不起作用,(我在這之前嘗試過,但我沒有保存輸出),但它與文件有同樣的
ls
問題rm
。第 8 次編輯:這是按照建議使用十六進製字元:
rl]$ ls --show-control-chars | xxd 0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a mikea......cnt. rl]$ rmdir $'mikea\6d69\6b65\61c3\a2c2\81c2\8463\6e74\0acnt' rmdir: failed to remove `mikea\006d69\006b651c3\a2c2\\81c2\\8463\006e74': No such file or directory rl]$ ls ls: cannot access mikeaâcnt: No such file or directory mikeaâ??cnt rl]$
第 9 次編輯:對於
stat
命令:rl]$ stat mikeaâ^Á^Äcnt stat: cannot stat `mikeaâ\302\201\302\204cnt': No such file or directory rl]$
從所有輸出來看,它似乎更有可能存在評論中建議的錯誤或其他 NFS 不當行為。
編輯 10:這是一個要點中的 strace 輸出,因為它是如此之大,它的輸出或這兩個命令:
strace -xx rmdir ./* | grep -e '-1 E'` strace -xx -e trace=file ls -li`
https://gist.github.com/mikeatm/e07fa600747a4285e460
編輯11:所以在上面
rmdir
我注意到我可以cd
進入目錄,但之後rmdir
我不能cd
再次,類似於昨天。和.
文件..
存在:rl]$ ls mikeaâ??cnt rl]$ cd mikeaâ^Á^Äcnt/ mikeaâ^Á^Äcnt]$ ls mikeaâ^Á^Äcnt]$ ls -a . .. mikeaâ^Á^Äcnt]$ cd ../
最終編輯:我看到一個本地管理員對此進行了處理,並通過登錄伺服器本身並從那裡刪除來處理它。他們的解釋是,名稱中的字元集不合適可能是一個問題。
這篇文章的以下摘錄可能解釋了為什麼該目錄拒絕被刪除:
NFSv4 要求使用 UTF-8 通過網路交換所有文件名。NFSv4 規範 RFC 3530 在第 1.4.3 節中規定文件名應採用 UTF-8 編碼:“稍有不同,文件名和目錄名採用 UTF-8 編碼以處理國際化的基礎知識。” 在較新的 NFS 4.1 RFC (RFC 5661) 部分 1.7.3 中也可以找到相同的文本。目前的 Linux NFS 客戶端只是直接傳遞文件名,而無需從目前語言環境到 UTF-8 和從 UTF-8 進行任何轉換。在使用遠端 NFSv4 系統的系統上,使用非 UTF-8 文件名可能是一個真正的問題;任何遵循 NFS 規範的 NFS 伺服器都應該拒絕非 UTF-8 文件名。因此,如果您想確保您的文件實際上可以從 Linux 客戶端儲存到 NFS 伺服器,則目前必須使用 UTF-8 文件名。換句話說,
UTF-8 是一種長期的方法。系統必須支持 UTF-8 以及許多較舊的編碼,讓人們有時間切換到 UTF-8。要使用“UTF-8 無處不在”,需要更新所有工具以支持 UTF-8。幾年前,這是一個大問題,但到 2011 年,這基本上是一個已解決的問題,我認為對於那些少數尾隨系統來說,軌跡非常清晰。
並不是所有的字節序列都是合法的 UTF-8,你也不想弄清楚如何顯示它們。如果核心強制執行這些限制,確保只允許使用 UTF-8 文件名,那麼就沒有問題……所有文件名都是合法的 UTF-8。Markus Kuhn 的 utf8_check C 函式可以快速確定一個序列是否是有效的 UTF-8。
文件系統應該要求文件名符合一些標準,不是因為某些邪惡的需要控制人,而只是為了讓文件名在以後總是能正確顯示。缺乏標準使使用者的事情變得更難,而不是更容易。然而文件系統並不強製文件名是 UTF-8,所以它很容易有垃圾。
像這樣刪除文件/目錄的一種方法是通過它們的 inode-reference。
要查找目前目錄中元素的 inode:
ls -i 14813568 mikeaâcnt
要刪除它:
find . -inum 14813568 -delete