尝试使用“rm -rf”删除目录,但是获取它不为空的消息


29

我尝试使用“rm -rf”删除目录,我收到消息“Directory not empty”:

Bens-MacBook-Pro:please benjaminhocking$ ls -lart empty_directory/
total 16
drwxr-xr-x  5 benjaminhocking  staff  170 Aug 27 14:46 .
drwxr-xr-x  3 benjaminhocking  staff  102 Aug 27 15:28 ..
Bens-MacBook-Pro:please benjaminhocking$ rm -rf empty_directory/
rm: empty_directory/: Directory not empty
Bens-MacBook-Pro:please benjaminhocking$ rmdir empty_directory/
rmdir: empty_directory/: Directory not empty

如果我使用Finder尝试相同的事情(将文件夹拖到垃圾箱),我会收到消息

由于项目“empty_directory”正在使用,因此无法完成操作。

我试过xattr -d com.apple.quarantine,纯粹是出于迷信,但它并没有好处。

一个可能很重要的上下文是这个目录最初位于一个目录中,该目录应该被我在终端锁定之前发出的“make clean”命令删除,之后我有一半以上的其他程序运行也锁定,包括Skype,最终操作系统本身。我最后不得不按住电源键重新启动计算机。

编辑添加:我留下的另一个重要信息是,这发生在加密文件夹中encfs。我能够在事物的加密方面追踪相应的文件夹并将其删除。我仍然不知道为什么我不能像通常那样从解密方面做到这一点。如果有人对此有充分的答案,我现在就不予回答。


2
你在这个目录中打开了任何其他shell,还是只运行它的应用程序?术语“正在使用中”也可能意味着(虽然我从来没有经历过rmdir这种情况 - 但它通常是导致无法卸载音量的原因)。
Izzy 2012年

在那些特定命令发布时不是。就在此之前我完成了一次完全重启。
Ben Hocking

我有时会遇到与EncFS相同的问题,到目前为止我还不知道如何解决这个问题。有什么新事吗?
Martin Preusse

@emempe:我最终做的是删除加密空间中的文件夹,使用上次修改的时间戳作为我的标识符。(这可能很危险。)如果我想出一个更好的解决方案,我会告诉你的。
Ben Hocking

@BenHocking:我也这样做。对我来说很少发生,所以我对此很好。不过,我不喜欢我的EncFS以某种方式损坏的感觉......;)我的EncFS在Dropbox中,也许是一些连接?
Martin Preusse

Answers:


9

重新启动计算机并rmdir(1)再次运行。

$ rmdir -r empty_directory/

如果这不起作用,那么尝试:

$ rm -rf empty_directory/

如果它仍然无效,假设OS X已lsof(8)预先安装,则输入:

$ lsof +D empty_directory/

这应该告诉任何程序是否正在使用此目录中的任何文件。我认为HFS +文件系统不允许删除正在使用的文件。无论如何,killall(1)任何可能使用此目录的可执行文件或其中的任何隐藏文件。Finder可能正在使用empty_directory目录中的隐藏文件来存储文件夹视图设置。希望这可以帮助。

PS:要了解是否lsof(8)已安装,请输入:

$ lsof

如果输出看起来像这样,那么lsof(8)就会在您的系统上安装。

lsof: /usr/bin/lsof /usr/bin/X11/lsof /usr/share/man/man8/lsof.8.gz

检查该目录中的任何隐藏和加密文件或加密密钥文件。这些可能是罪魁祸首。


3

使用“磁盘工具”修复磁盘为我解决了这个问题。


这将适用于我认为的大多数情况。完全适合我。Thanx
GeekRide

特定命令是“文件”菜单下的“运行急救...”。在我意识到之前,我花了一点时间在菜单中搜索“修复”这个词!
RoG

2

如果发生这种情况并且您确定要删除所有内容,则应尝试使用 sudo rm -rf directory/


1
由于某种原因,这不适用于〜/ .Trash。
MarcusJ 2015年

1
除非问题是权限,否则这根本不起作用,这将是对控制台的不同错误消息。
tresf

2

我在尝试删除目录(rm -r dirname)时遇到了这个错误。在我搜索并发现这个帖子之前,我已经尝试了我在这里阅读的所有建议。我不知道是否有任何额外的点无意中没有说明原始问题,但在我的情况下,麻烦的根源,解决方案是:

  • 有问题的目录位于网络安装的磁盘上

  • 任何ls从Finder或命令行的尝试表明什么,但...

  • 我通过ssh命令登录网络磁盘服务器并在ls -al那里检查。结果显示,除了...几个.__filename具有扩展安全信息的项目(即+附加到模式)。

我相信这些都是,或类似,使用时,我首先注意到的Mac OSX创建年前的文件cp -Rtarcpio存档或移动文件组。我当时推断他们习惯于在移动后正确地重置一些文件属性 - 可能是uid / gid,mode,acls,mtime / utime / ctime等; 我不是很确定 - 那段时间之前没有被这些命令正确重置的属性(我记得在使用通常的形式时,OSX过去包含mvmaccpmac命令解决这些.__filename类型的文件之前出现的问题cptar等)。

在将这些文件写入内部,USB或Firewire驱动器时,我从未遇到过删除这些文件的问题。这是我第一次在网络磁盘上找到它们; 从服务器端的客户端完全检测不到,但从服务器端查看时各方都正常。

rm -rf dirname 从网络磁盘服务器上的登录正确删除目录及其内容。

所以,还有另一个答案就是它的价值; 如果任何人与网络磁盘一起出现,这个问题的另一个潜在解决方案。


1

为了读者的利益:

小心rm -rf这种情况! 如果碰巧是网络共享,它可能会在其他地方产生问题! 你被警告了!

在几乎所有情况下,如果a directory似乎是空的,请使用rmdir directory或者也许sudo rmdir directory。不要使用rm(或del在Windows下)。如果这不起作用,您需要找出阻止此请求的内容,修复该请求然后重试rmdir

请注意,我不知道OS-X,但我认为那里的东西与Unix / BSD行为非常相似。

有问题的目录很可能只是一个挂载点(来自encfs)或驻留在挂载点上,该挂载点变为只读状态或卡在某种不正确的状态(阻止了目录被删除)。如果您现在强制删除目录,可能会发生非常糟糕的事情。

在好的情况下,目录确实是空的,因此删除它(破坏安装等)没有进一步的伤害。在坏情况下,它不是空的,只是看起来是,这意味着,你破坏了你可能不想杀死的东西。这一切都取决于安装类型,驱动程序正在使用等.pp。

如果事情得到相当好的实施,通常不会发生任何不好的事情。然而,这不是正常情况。事情已处于一种奇怪的状态,这意味着:有些事情是错误的,所以最好不要试图进一步混淆!如果某些东西被破坏,任何错误的触摸都可能会破坏它

例如,如果您在网络共享上遇到竞争条件,则可能是您rm -rf删除了由其他人复制到共享的数据。

但是rmdir除了删除真正的空目录之外,保证永远不会造成伤害。这是真实的,即使在NFS,因为NFS只保证对真正的原子行为mkdirrmdir,但在其他地方。

供参考:

您可以使用该工具检测挂载点mountpoint directory。或者查看输出mount并尝试在那里发现你的坐骑。但要注意,至少在Linux下这可能是谎言。使用该mountpoint实用程序更可靠但不太方便。

在这种情况下,您找到了mountpoint,您可以卸载它然后删除目录,这是以下顺序:

umount directory rmdir directory

如果需要sudo,像往常一样使用。

笔记:

  • 网络共享可能会rmdir因访问权限而拒绝(以及其他任何内容)。

  • 有缺陷的文件系统可能会拒绝rmdir,具体取决于失败策略。也许你会在那种情况下看到合理的信息,也许不会。

  • 在Linux(可能还有任何现代操作系统)下,您还可以使用不同的方式限制访问(例如,只读装置,SeLinux等功能)。这意味着你没有看到它是一个挂载点,你没有看到任何错误,但它只是不起作用。在这种情况下,您需要寻找其他原因,它可以深深地埋没在操作系统中。如果您看到一些合理的错误消息,则取决于该工具。也许可以dmesg在Linux下查看syslog / kernel-log (对不起,我不知道OS-X的等价物)。

  • 请注意,强制文件锁定也可能是一个来源。虽然这在Windows上是正常的,但通常情况并非正常情况下Unix和我从未听过目录。POSIX涵盖强制文件锁,但它们是可选的。

  • 在这种情况下,相关目录常常与您认为的文件系统不同。您可以使用命令找出哪个df directory(我认为在OS-X下它是相同的)。

  • 您可以使用目录上的工具stat或更深层次的工具进行检查statfs。然而,这些对于普通人来说有点低,并且这些工具通常对普通用户隐藏得很少。

  • 目录可以包含有趣名称的文件。就像一个立即删除终端输出的文件,所以看起来它不存在。尝试ls -al | less像MidnightCommander 这样的东西mc

还有一大堆其他可能性,包括虫子,haxors,外星人,或者更像仙女的异国情调。但通常开始在那里寻找是不明智的,而是首先尝试找到你身边的错误,因为“错误的人性化”。


1

这也可能是我刚刚解决的一个案例,其中一个破坏的符号链接在服务器端,并且客户端通过CIFS看不到。符号链接填充了非空目录,但是在取消链接目录之前,客户端无法查看或统计符号链接以清除目录。由于它是不可见的,它创造了这个悖论,从客户端来看它是空的,但在rm的挑战下“不空” 。如果您具有对服务器的SSH访问权限,请在该端尝试一个shell,并查看该目录是否为空或者是否有符号链接损坏。我能够在Drobo5N上做到这一点并且它保存了我的屁股。


这对于处于类似情况的其他人可能会有所帮助,但对我来说绝对不是这样,因为我当时没有连接到任何服务器。
Ben Hocking

1

在这里尝试了所有答案但没有结果。但是,我可以使用mv命令将目录移到一边,这使我可以继续。


1

对我有用的唯一解决方案来自https://unix.stackexchange.com/questions/234876/unable-to-delete-a-file-whatever-i-do

将它们移动到/ tmp并重新启动。

我尝试的其他选项是:

  • 磁盘工具 - 急救。
  • lsof +D bad_file 显示没有输出。
  • sudo rm -rf
  • 引导到单用户终端和rm -rf

1
来自单用户终端的Fsck没有帮助,也rm -rf没有lsof +D显示任何内容。奇怪的是,我能够将违规的dirs移动到/tmp,但重启后没有被移除。同样的问题仍然存在,但至少它有点偏僻。
anapsix

0

尝试从Windows打开该目录,Mac OS中可能会显示某些内容。在Mac和Win PC之间进行了大量复制操作之后,我遇到了类似的问题:即使在终端目录也是空的,但在Windows上我发现了一个隐藏的Windows文件,所以我从那里成功删除了目录。

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.