Files

如何刪除這個不可磨滅的目錄?

  • July 26, 2021

我解壓了一個損壞的 tar 文件,並設法得到了一些我無法刪除的目錄,如果我嘗試刪除它,似乎找不到它,但ls顯示它存在,無論是使用 bash 還是使用 python 我都得到類似的行為,除了在我嘗試用 刪除它之後rm -rfls抱怨它找不到它,然後它列出它(見下文之後rm -rf)。該find命令顯示該文件存在,但我仍然想不出刪除它的方法。

這是我的嘗試:

在這裡你可以看到lsfind同意我們有一個目錄,

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,這個螢幕截圖:

ls 輸出

第 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

引用自:https://unix.stackexchange.com/questions/147377