du 无法访问文件 - 没有此类文件或目录错误

du 无法访问文件 - 没有此类文件或目录错误

我在特定文件夹内有很多子文件夹,而这些子文件夹又包含很多较小的文件。它们是通过编程创建的,所以我不知道里面有多少个。

我决定删除所有这些子文件夹和文件,因此我发出了命令,

rm -rf foldername/

然而, rm 命令花费了很多时间来执行,我认为这是完全正常的,因为它必须取消所有文件的链接。

但是,我决定通过发出命令来检查此文件夹的大小是否正在减少,

du -sh foldername/

但是,上面的命令给我的错误是,

du: cannot access `foldername/file': No such file or directory

为什么会发生这个错误?

答案1

du与任何递归遍历目录树的命令一样,按以下方式操作:

  1. 读取有关文件的信息,通过其路径访问。在 的情况下du,系统调用stat提供文件类型(特别是是否是目录)和大小。最初,名称取自命令行。
  2. 如果文件是一个目录,打开它和文件名列表。
  3. 对于目录中的每个文件名,构造一个文件路径 ( ) 并从步骤 1 开始递归地对其进行操作。此步骤可以部分与前一步并行执行(这取决于实现)。DIRECTORY/ENTRY_NAME

rm正在运行并一一删除文件。有时,du会在步骤 2 中读取文件名,但当它在步骤 3 中处理该文件时,rm已将其删除。您是否会看到此错误以及出现多少次取决于 和 的相对速度,rm并且du几乎是不可预测的。

¹ 直接访问文件只有两种方法:通过路径(包括目录信息,相对或绝对),或(如果文件打开)通过描述符。

答案2

忽略du命令错误即可

按照du链接,我可以通过提及来忽略错误,

du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)

但我更具体地想知道删除文件时发生了什么。我特别想知道为什么该du命令无法给出大小以及为什么在该rm命令取消链接文件时它会报告错误。

这在中进行了解释关联。我只是重新表述一下,看看这里发生了什么。

  1. rm命令已取消文件链接。 (即从其父目录中删除文件名条目)。
  2. 但是,尽管没有与其关联的文件名,但文件句柄仍然有效。这是du命令报告它没有看到文件或目录的地方。

确认

我做了一些更多的研究来验证这些文件实际上没有链接。

pid使用 rm 流程获得了ps。现在,我发出以下命令来查看文件是否仍然可用。

lsof +L | grep 11771

上面的命令给了我下面的输出。

rm   11771  root  4r DIR  8,17 175882240     2   47333397 /foldername/filename

因此,根据上面的输出,该文件已取消链接。

由于该rm命令仍在运行,因此该du命令报告错误。

相关内容