it-swarm.cn

unlink和rm有什么区别?

解除链接的速度比rm快吗?

64
Marcin

两者都是同一基本函数的包装,该基本函数是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)之间的区别。平台之间的语义仍然会有所不同。

69
Dan Carley

在POSIX规范级别, rm 的行为要比 nlink 的行为更严格地指定。

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

8
Mike G.

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

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

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

4
Thomas