如何删除此不可删除的目录?


40

我未解压的腐败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 try的输出 mikea\xc3\xa2\xc2\x81\xc2\x84cnt和以下屏幕截图还多:

ls输出

第四次编辑:这是使用通配符的尝试:

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

而且行为发生了变化,现在lscd 这样做:

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.

这是在尝试删除后发生的,我认为这可能是ninc 问题,如vinc17 此处答案之一所示。

6日编辑:这是的输出lsofls -a

rl] $ / usr / sbin / lsofmikeaâ^Á^Äcntlsof:mikeaâ\ xc2 \ x81 \ xc2 \ x84cnt的状态错误:没有这样的文件或目录

上面是错误的,这里是正确的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

第七次编辑:移动将不起作用,(我在所有操作之前都尝试过,但是我没有保存输出),但是它 与文件lsrm文件都存在相同的问题。

第八次编辑:这是按建议使用十六进制字符:

 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]$

9th Edit:对于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 ../

最终编辑:我看到一个本地管理员对此进行了处理,方法是登录服务器本身并从中删除。他们的解释是,名称中的字符集不合适可能会引起问题。


您是否有理由将管道find的输出传递给其他命令,而不是仅仅使用它的exec选项?
HalosGhost

@HalosGhost没有理由,请参见编辑以获取有关您的问题的更多信息
mike-m

2
作为对unix和linux经验很少的人,这是我的想法:尝试使用将该目录重命名为没有这些符号的目录mv。也许您可以在此之后将其删除。或者,您可以尝试将目录移动到更深的文件夹级别(可能带有通配符),然后删除将其移动到的文件夹。
2014年

4
我怀疑目录仅存在于客户端的内存中,而在服务器上早已消失。您是否尝试过卸载并再次安装?您是否尝试过重启客户端?在其他客户端上可见吗?
kasperd 2014年

6
@ mike-m听起来您已经在NFS服务器中遇到了NFS错误。要么是服务器上的文件系统损坏。我怀疑除了等待NFS服务器管理员处理之外,您是否真的可以做其他事情。
derobert

Answers:


11

从以下摘录这篇文章可能解释了为什么该目录拒绝被删除:

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之间进行任何转换。在使用远程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,因此很容易造成垃圾。


这似乎回响了本地管理员的解释,我将其标记为管理员解释的答案。请看我的最终编辑
mike-m

19

删除文件/目录这样的一种方法是通过它们的inode引用。

要在当前目录中查找元素的索引节点:

ls -i
14813568 mikeaâcnt

要删除它:

find . -inum 14813568 -delete

请参阅第5个修改。
mike-m

4
不,这不会通过文件的inode删除文件。这将查找给定inode的文件名,然后通过文件名删除该文件。它在这里无济于事,因为已经使用正确的名称进行了尝试(以及其他使用不正确名称的尝试)。
吉尔斯(Gillles)“所以-别再邪恶了”

@Gilles-从技术上讲,它查找inode牙科数据库并返回文件名,但我同意。
mikeserv

1
@Nicolai对我没有帮助。目录非空消息出现。
衍射

1
是的,哈哈,关于这个的有趣故事:我要删除的文件具有?inode引用。那你怎么删除呢?
Nic Hartley'17

7

您不应该在命令行中使用非ASCII字符,因为您可能会由于某种原因看到它们不一定与文件名相对应(Unicode有多种表达重音字母的方式)。就像是:

rm -rf mike*

应该起作用,因为文件名是由Shell直接生成的。但是请确保只有一场比赛(echo mike*先进行确认)。

好吧,如果cd可行,那么就没有理由为什么rmls不应该说No such file or directory,这样问题可能就在文件系统级别。

注意:请勿ls用于查找目录是否为空ls -a

该目录可能仍被其他进程使用(包括如果它是某个进程的cwd)。恕我直言,这就是为什么它仍然“存在”但会产生错误的原因,例如ls;; lsof可能会给您一些信息,但是对于NFS,您需要查找使用它的计算机。特别是对于NFS,这会产生奇怪的错误。ls -a.nfs*某些情况下,父目录中的可能会显示文件/目录。

当你拿到时:

$ ls
ls: cannot access mikeaâcnt: No such file or directory
mikeaâ??cnt

我怀疑由于NFS缓存和/或因为它被另一个进程使用,但没有相关信息,该文件仍存在于目录表中。当ls试图获取有关文件本身的信息,它得到一个错误本身已不存在的文件(它只有在目录表),因此显示的错误。然后ls输出文件名,因为它在目录表中。在一种情况下您有问号的事实,而在另一种情况下却没有,是由于ls恕我直言的显示错误(与您的问题无关)。


我之前尝试过通配符,但没有用,并且我未能在我的问题中发布该尝试,我将更新结果
mike-m

见我的第三个编辑。恕我直言,这是由于NFS(可能不是损坏,但缓存错误)以及另一个进程正在使用目录的事实所致。在某些情况下,需要重新引导所有内容(服务器和客户端)。
vinc17 2014年

也许这可以解释事情,但是我不能确定,因为我没有将其删除进行测试的权限。参见第五编辑。
mike-m

1
@ vinc17请不要在答案中使用“ EDIT”,因为对于新读者而言,这没有意义(已经有编辑历史记录)
Bernhard 2014年

iv添加了一些lsof输出,不确定是否可以告诉您任何信息,
mike-m

3

我已经使用find-exec指令进行了个人测试:

$ mkdir -p mikeaâcnt
$ ls
mikeaâcnt
$ find -maxdepth 1 -type d -empty -exec rm -rf {} +
$ ls
$ 

该文件夹已正确创建并正确删除。

@Igeorget所指出的,如果您具有GNU,则还有一个更简单的方法find

$ find -maxdepth 1 -type d -empty -delete

我还测试了此命令,它可以正常运行


而且,如果您使用GNU的find,也有一个-delete选择。
lgeorget 2014年

请参阅第3版,
mike-m

1

我相信,我也遇到过同样的问题。我以前用文件名看到了这个问题ls在这种情况下,文件显示为â??,但是我可以用删除它rm ☃

这导致我采用以下方法将错误的名称转换为正确的名称:

首先获取文件名的字节:

$ ls --show-control-chars | xxd
0000000: 6d69 6b65 61c3 a2c2 81c2 8463 6e74 0a    mikea......cnt.

然后使用以下网站的十六进制输入将这些字节解码为UTF-8,以获取unicode码点:http : //software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder

U+006D LATIN SMALL LETTER M character
U+0069 LATIN SMALL LETTER I character
U+006B LATIN SMALL LETTER K character
U+0065 LATIN SMALL LETTER E character
U+0061 LATIN SMALL LETTER A character
U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX character (&#x00E2;)
U+0081 <control> character (&#x0081;)
U+0084 <control> character (&#x0084;)
U+0063 LATIN SMALL LETTER C character
U+006E LATIN SMALL LETTER N character
U+0074 LATIN SMALL LETTER T character

注意这些都在字节边界以下。我们获得以下字节:

6D 69 6B 65 61 E2 81 84 63 6E 74

如果我们以UTF-8处理此序列,则会得到:

U+006D LATIN SMALL LETTER M character
U+0069 LATIN SMALL LETTER I character
U+006B LATIN SMALL LETTER K character
U+0065 LATIN SMALL LETTER E character
U+0061 LATIN SMALL LETTER A character
U+2044 FRACTION SLASH character (&#x2044;)
U+0063 LATIN SMALL LETTER C character
U+006E LATIN SMALL LETTER N character
U+0074 LATIN SMALL LETTER T character

因此,您的文件名是:mikea⁄cnt,用小数斜杠代替普通的正斜杠。您现在可以将此名称传递给rmdir


太巧妙了,如果我再次遇到这个问题,请记住这一点。好一个 +1
mike-m

0

在获得了正确的文件名/文件夹名的十六进制代码(使用一种合适的方法,我可能会选择ls --show-control-chars | xxd)之后,在bash下运行时,应使用一些特殊的结构来处理此类字符:

rmdir $'mikea\xc3\xa2\xc2\x81\xc2\x84cnt'

否则,将反斜杠视为香草反斜杠。


请看一下我的编辑(第8次编辑)
mike-m

@ mike-m当然不存在,因为ls在输出数据中包含换行符,并且“ cnt”已重复。也许您可以尝试直接将行复制并粘贴到我的答案中,看看它是否有效?
张小伟

不,仍然如此:```rl] $ rmdir $'mikea \ xc3 \ xa2 \ xc2 \ x81 \ xc2 \ x84cnt'rmdir:无法删除`mikeaâ\ 302 \ 201 \ 302 \ 204cnt':没有这样的文件或目录```
mike-m

在那种情况下,很可能是NFS问题和区域设置的结合,阻止大多数系统实用程序传递不正确的非UTF8字节。而且看来inode的删除使情况变得更糟。就目前而言,我唯一能想到的方法就是将系统设置为无语言环境(使用C语言环境LC_*LANGenv变量),并挂载不带任何字符集选项的NFS
Abel Cheung

0

您是否尝试过使用rm -rf ./mikeaâcntrm -rf "./mikeaâcnt"或绝对路径?也可以rm尝试rmdir ./mikeaâcnt


问题的一部分是,其中的字符 mikeaâcnt似乎不是文件名,而是 ls 显示的内容,请参阅第3次编辑
mike-m

0

您是否尝试使用以下命令获取该文件的索引节点stat

stat mike*

这应该为您提供inode编号(和其他数据),然后您可以尝试将其删除。


iv添加了令人stat惊讶的编辑,
mike-m

0

我有类似的问题。您是否有Gnome,KDE或某种Xwindow DM?如果确实打开文件浏览器,然后从那里删除文件。

它应该工作。

我想从命令行中看到一个解决方案,但就我而言,在浪费了很多时间试图弄清楚如何从命令行中删除它之后,我发现它就像从nautilus或从nautilus中删除任何其他文件一样简单。任何其他文件浏览器(事实是我只尝试过鹦鹉螺)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.