我在特定文件夹内有很多子文件夹,而这些子文件夹又包含很多较小的文件。它们是通过编程创建的,所以我不知道里面有多少个。
我决定删除所有这些子文件夹和文件,因此我发出了命令,
rm -rf foldername/
然而, rm 命令花费了很多时间来执行,我认为这是完全正常的,因为它必须取消所有文件的链接。
但是,我决定通过发出命令来检查此文件夹的大小是否正在减少,
du -sh foldername/
但是,上面的命令给我的错误是,
du: cannot access `foldername/file': No such file or directory
为什么会发生这个错误?
答案1
du
与任何递归遍历目录树的命令一样,按以下方式操作:
- 读取有关文件的信息,通过其路径访问。在 的情况下
du
,系统调用stat
提供文件类型(特别是是否是目录)和大小。最初,名称取自命令行。 - 如果文件是一个目录,打开它和读文件名列表。
- 对于目录中的每个文件名,构造一个文件路径 ( ) 并从步骤 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
命令取消链接文件时它会报告错误。
这在中进行了解释这关联。我只是重新表述一下,看看这里发生了什么。
- 该
rm
命令已取消文件链接。 (即从其父目录中删除文件名条目)。 - 但是,尽管没有与其关联的文件名,但文件句柄仍然有效。这是
du
命令报告它没有看到文件或目录的地方。
确认
我做了一些更多的研究来验证这些文件实际上没有链接。
我pid
使用 rm 流程获得了ps
。现在,我发出以下命令来查看文件是否仍然可用。
lsof +L | grep 11771
上面的命令给了我下面的输出。
rm 11771 root 4r DIR 8,17 175882240 2 47333397 /foldername/filename
因此,根据上面的输出,该文件已取消链接。
由于该rm
命令仍在运行,因此该du
命令报告错误。