是否可以在恒定时间内删除目录?

是否可以在恒定时间内删除目录?

我通常使用 . 一次删除整个目录rm -rf。我刚才注意到目录越大,所需的时间就越长(递归计算)。

类 Unix 系统是否公开了一种删除在恒定时间内运行的目录的替代方法?似乎应该可以“直接”删除目录,而根本不触及现在无法访问的内容。

文件系统是否存在某些特征,迫使您递归地遍历目录的内容以删除目录本身?

答案1

当你删除目录时,你必须递归地删除它的内容。为什么会这样呢?

简化地说,我们可以说“目录”是文件,其中包含对的列表。如果您只是“释放驱动器上的目录块”,会发生什么?

让我们考虑删除常规文件。程序(如rm)调用unlink()系统调用。操作系统(更具体地说,文件系统驱动程序)检查硬链接的数量(filename在上一段的目录中)。如果为零且文件未打开,则可以物理删除它。这样,我们就知道如何删除文件了。

现在让我们再次看看目录删除。当您只释放块时,您不会unlink在其中添加文件,也不会减少目录中任何文件的硬链接计数器。对于子目录、子子目录等中的任何文件,结论是什么?确切地说,我们需要unlink对删除的目录中的所有文件执行此操作,因为我们不想在文件系统中获得无法删除的垃圾。

因此,您可以使用@SYN的解决方案(rm在后台运行),但无法在恒定时间内删除目录。

答案2

如果该目录安装在其自己的文件系统上,您可以卸载它,使用 重新创建它newfs,然后重新安装它。无论目录大小如何,都将花费相同的时间。

答案3

类 Unix 系统是否公开了一种删除在恒定时间内运行的目录的替代方法?似乎应该可以“直接”删除目录,而根本不触及现在无法访问的内容。

这是文件系统实现的问题。现在大多数从事文件系统工作的人都不太担心rm -rf performance because it simply doesn't come up in the file server and database workloads that everyone is trying to optimize.

请注意,btrfs支持在恒定时间内删除子树 - 但您必须subvolume提前使用它。

答案4

使用:

rm -fr /path/to/directory &

这将使您的命令背景化

您可以列出后台任务jobs

将列出作业 ID。可以使用它附加回您的流程:

$ sleep 60 &
[1] 22316
$ jobs
[1]+  Running                 sleep 60 &
$ fg %1
sleep 60

已经启动rm命令后,您还可以点击Ctrl+ Z,这会暂停您的命令,然后键入bg以在后台取消暂停。

请注意,您可以使用这些命令控制的作业列表已绑定到您的 shell - 并且只能从当前 shell 中恢复。

相关内容