cp
、scp
和rm
其他命令需要标志来-r
对目录执行操作,而不仅仅是对文件执行操作。
无法复制目录,因为 WHOOPS 你忘记了 -r 标志
我觉得这不再相关。这些程序应该只是被编写为有条件地别名旧命令。如果d
它是一个目录并执行递归目录移动命令
还有其他原因导致它不应该是默认设置吗?其他标志组合是否需要该-r
标志,否则它将不起作用?
答案1
还有其他原因导致这不应该是默认的吗?
如果cp
/rm
真的那么“聪明”,那么当您只想复制或删除一个文件时,一个命令中的简单拼写错误就可能递归处理某个“随机”目录。没错,拼写错误仍然可能导致错误的文件被删除,但“一个文件”与“整个目录树”可能会产生巨大的差异。
这不一定是拼写错误;它可以是这样的命令中的(错误的)空变量:
rm "/mountpoint/bigdir/$smallfile"
cp
即使发生类似事故,它们也并非完全安全,因为它们可能会覆盖目标文件。因此,并不是scp
只要删除不需要的副本,问题就解决了。
mv
请注意,此论点也适用于。由于历史原因,此特定工具有所不同:
的一些历史版本
mv
可以移动目录,但不能移动到不同的文件系统。标准开发人员认为这是一个令人讨厌的不一致之处,因此 POSIX.1-2017 的这一卷要求目录能够跨文件系统移动。没有-R
选项可以确认移动目录是否是实际意图,因为在历史实践中移动目录不需要这样的选项。有时要求应用程序根据目标指定它似乎同样不一致。
(来源)
移动文件(可能是目录) 在单个(基于 inode 的)文件系统中根本不是递归的。只有父目录(新目录和旧目录(它们可以相同))被更改。mv
即使移动目录,这种最基本和最古老的用法也不是递归的。我认为链接文章中写着“有时,取决于目的地”,这意味着-R
当目的地位于不同的文件系统中时是合理的,但当目的地位于同一文件系统中时则完全不合理。选择不引入-R
(或-r
或其他)。这种方式mv
在设计上遵循了您的假设。
这些程序应该被编写为有条件地为旧命令添加别名
请注意,当指定单个文件时,-r
仍然是允许的。因此不需要“有条件地”,并且您可以简单地使用 将相关命令别名化为其形式-r
,如果这确实是您想要的。