Dan*_*ley 76

两者都是相同基本功能的包装器,即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
Run Code Online (Sandbox Code Playgroud)

然而,如果我们谈论的是对系统unlink(2)函数的纯粹调用,我现在意识到这可能不是你所考虑的。

您可以unlink()对目录和文件执行系统操作。但是,如果该目录是其他目录和文件的父目录,则指向该父目录的链接将被删除,但子目录将悬而未决。这不太理想。

编辑:

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

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

Mik*_* G. 10

在 POSIX 规范级别,rm所做的比unlink更严格地指定。

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


Tho*_*mas 5

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

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

unlink 只是一个rm“光”。rm 有更多功能,但它们做同样的事情。