为什么 `cp` 和 `rm` 分别对待目录?

rah*_*hmu 10 cp rm

为什么工具喜欢cp和rm处理目录与常规文件分开?它们都要求用户明确指定她想要递归行为,否则它们根本不会处理目录。

我与计算机的第一次交互(不久前)是在 Windows/GUI/点击/拖放环境中进行的,无论目标如何,这些操作的行为总是相同的,这似乎总是很自然的。

当我使用通配符发出命令时,这种行为尤其让我感到沮丧。如果我想删除目录 ( *) 中除非空子目录之外的所有内容怎么办?

我只能想象这是某种防止用户用脚射击自己的安全功能,但这与我对一些 Unix 原则的理解相矛盾:

  • Unix 通常不会保护用户免受自己的伤害。它一直假设用户知道她在做什么。
  • 对于Unix,一切都是文件。目录不就是另一个文件吗?为什么他们会受到不同的对待?

我的问题:

  • 这种行为是源于技术限制还是故意的选择?

如果是后者,

  • 是否有任何关于促使这种选择的原因的历史记载?

pet*_*rph 11

Derobert 的为什么 unix mv 程序不需要目录的 -R(递归)选项但 cp 需要它?基本上回答了您的问题:复制或删除常规文件与对目录执行相同操作不同,因为对于目录,您必须处理其中包含的所有文件。因此操作是根本不同的。

另外值得注意的是,有一个特殊的实用程序rmdir只能作用于空目录。如果不检查事实,这导致人们得出结论,也许最初rm只能删除非目录,而必须通过递归使用rm清空目录然后rmdir删除这些目录来实现深度删除。

  • 从最终用户的 POV 看来,确实很奇怪,但您实际上是在问原因。:) 至于包装器——这完全取决于它们有多“简单”(以及你仍然想称之为“简单”的东西)。现代的 `rm` 绝对不仅仅是一个简单的包装器(它能够同时删除 mroe 文件和目录)。如果您不喜欢给它提供 `-r` 选项,请使用您的 shell 的别名功能或创建您自己的包装器来放置它(这会更慢,但与您使用的 shell 无关)。 (2认同)