unlink和rm有什么区别?


Answers:


68

两者都是unlink()系统调用相同基本功能的包装。

权衡用户空间实用程序之间的差异。

rm(1)

  • 更多选择。
  • 更多反馈。
  • 健全性检查。
  • 由于上述原因,单次通话的速度稍慢。
  • 可以同时使用多个参数来调用。

unlink(1)

  • 减少理智检查。
  • 无法删除目录。
  • 无法递归。
  • 一次只能接受一个论点。
  • 由于它的简单性,单次调用的边际倾斜度更高。
  • 与提供rm(1)多个参数相比,速度较慢。

您可以通过以下方式证明差异:

$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'

$ touch $(seq 1 100)
$ time rm $(seq 1 100)

real    0m0.048s
user    0m0.004s
sys     0m0.008s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done

real    0m0.207s
user    0m0.044s
sys     0m0.112s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done

real    0m0.167s
user    0m0.048s
sys     0m0.120s

但是,如果我们要谈论的是对系统unlink(2)函数的纯朴调用,我现在意识到这可能不是您要解决的问题。

您可以unlink()在目录和文件上执行系统。但是,如果目录是其他目录和文件的父目录,则到该父目录的链接将被删除,但子目录将悬空。这不理想。

编辑:

抱歉,澄清了unlink(1)和之间的区别unlink(2)。平台之间的语义仍然会有所不同。


这是否意味着在UNIX文件系统中,删除目录并递归删除该目录下的所有文件,将始终是与其所包含的文件/目录数量成比例的操作?当取消将父目录链接到其他目录/文件时发生什么情况?它永远不会消失,我永远失去了这个空间?
Marcin

6
从技术上讲,即使不是全部,在大多数文件系统上也可以保留孤立的目录/文件。解决此问题通常意味着运行文件系统修复工具。在Unix / Linux上,这些工具称为“ fsck”,并且针对不同的文件系统有一些特定的变体。如果他们确实恢复了某些东西,通常会将其保留在一个名为“ lost + found”的目录中
ConcernedOfTunbridgeWells 2009年

1
正确。rm将从树的底部向上递归。您可以通过演示如何操作mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1。如果取消链接父目录,则子级占用的空间应该丢失,直到fsck发现差异为止。
丹·卡利

1
你在说什么?$ mkdir -p 1/2/3 $取消链接1取消链接:不能取消链接“ 1”:目录导致“内存”泄漏的用户需要fsck吗?不太可能!
托马斯,2009年

1
Linux和FreeBSD联机帮助页都明确指出,尝试在目录上运行unlink()时它将失败。
托马斯,2009年

8

在POSIX规范级别上,对rm所做的规定比取消链接的规定更为严格。

如果您的脚本必须跨操作系统运行,那么使用rm可能会更好地提高结果的可移植性。


4

删除最慢的部分是文件系统代码和磁盘内容,而不是unlink()系统调用的用户空间准备。

即:如果速度差异很重要,那么您不应该将数据存储在文件系统上。

取消链接只是一个rm“灯”。rm具有更多功能,但功能相同。

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.