linux中cp命令的设计者为什么要在拷贝目录时用-r参数?

2022-05-08 科技 95阅读

Whyis-rrecursivenecessary

在文件系统工作的方式中,目录实际上不是包含文件的文件夹,而是包含连接到它的“子”文件的inode指针的文件。这意味着,从文件系统的角度来看,文件是一个文件,但是目录只是一个包含连接文件列表的文件。

因此,从命令行的角度来看,这样做:

$cpdir1copyDir1

基本上意味着将名为dir1的文件复制到名为copyDir1的新文件。就文件系统而言,dir1只是一个文件;只有当文件系统真正检查dir1以查看那一堆位的实际情况时,它才是“目录”这一事实才会显现出来。

r标志告诉文件系统递归地滚动文件/目录树,并将任何&所有可能是该文件的“子”的内容复制到新的位置。

至于为什么这看起来是多余的或冗余的,这实际上可以归结为处理文件系统的历史方法。以及创建一个系统,使其不受所有类型的用户相关错误的影响;偶然的和有意的。

意思是,假设你有一个~/bin文件在你的主目录中,你想复制,但不小心漏掉了~——因为你是人,会犯错误——所以它是这样的/bin:

cp/bin/~/copy_of_bin

由于/bin的“安全网”是一个目录,并且需要-r标志,您可以避免意外地将系统的整个二进制根复制到主目录中。如果这个安全网不存在,就会发生一场小的——或者可能是大的——灾难。

这里的逻辑是,在前gui(图形用户界面)的时代,逻辑/行为约定需要被设置,以避免用户创建可能导致系统死亡的错误。使用-r标志是其中之一。

如果这看起来是多余的,那么只需看看现代GUI系统,就可以将其置于Linux文件系统之上。GUI通过允许轻松地拖放文件和目录来解决基本的用户问题。

但在基于文本的界面领域中,该领域中的许多“用户体验”基本上都是基于逻辑的、基于hueristicl的障碍,这些障碍有助于控制用户,从而避免潜在的灾难。

同样,这也是为什么Linux/Unix文件系统没有默认设置的777权限和sudo权限,以及当用户设置777权限或授予所有人sudo权限时,真正的系统管理员会畏缩不前的原因。这些是确保系统稳定和尽可能“用户证明”的基本工作;任何急于缩短这些惯例的人都很可能在不知情的情况下对他们的系统造成损害。

附加信息:Unix堆栈交换站点上的另一个答案很好地解释了为什么目录的非递归副本存在问题;重点是我的。

嗯,没有-R标志,只能复制文件,因为不太常见的情况是,有人想非递归复制一个目录:非递归复制只会导致目录的第二个名称,直接指向相同的目录结构。因为这很少是人们想要的,实际上有一个单独的程序来做这个(ln),不允许目录的非递归副本。

因此,如果一个目录实际上是一个包含inode项的文件,那么直接复制该文件就相当于硬链接的工作方式。这不是任何人想要的。

声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com