我通常使用 . 一次删除整个目录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 中恢复。