我多次听说发行rm -rf
是危险的,因为用户可能会意外删除整个系统。但有时我想递归地删除一个目录,而不是每次都被询问。我正在考虑使用yes | rm -r
替代。
我想的是,yes | rm -r
比 安全吗rm -rf
?或者本质上,它们是相同的吗?
答案1
简短回答
不。然而,我真的很喜欢你将命令组合在一起的创造力。尽管如此,yes|rm -r
这是 UUOC 的一个很好的例子(你无私的你硒哦FCat) - 命令行结构的首字母缩略词(或更好的术语),仅为用户提供方便的功能。
长答案
我真的很喜欢你的问题,因为它可以在多个维度上得到回答。
技术维度
该rm
命令用于删除文件。该选项-r
或其较长的形式--recursive
用于递归删除文件(以及目录)。-f
(long :)选项--force
用于忽略不存在的文件和参数,并且从不提示确认。有关更多详细信息,请参阅手册页,我在下面链接了它。
因此,如果您想递归删除目录,那么rm -rf
正确的方法是。
语言维度
您多次听说发行rm -rf
是危险的,这是正确的。缺少的一点是,没有人告诉我们为什么会出现这种情况。
您已经在最初的问题中提供了答案:命令本身并不危险。用户输入了错误的内容,然后面临着他本来就不应该删除的已删除文件或目录。
那么您听到的警告的含义是:如果您确实想删除已输入的内容,请在按下 Enter 按钮之前三思而后行
你的问题意味着你没有完全理解它的意思,但你理解的是:“命令本身很危险,所以我需要找到另一种方法来删除我的文件和目录”。
当然,使用 Unix 命令可以做到这一点,因为总是有不止一种方法可以实现目标。然而,你听到的警告是为了真正反思,所以(创造性的)管道构造yes|rm -r
并不能帮助你思考。
这就是为什么它的危险性并不比rm -rf
.
历史维度
所有 Unix 命令都是使用以下口头禅构建的:“Do一工作,并完美地完成这项工作”。
然而,这对于习惯于操作系统的人来说是令人困惑的。例如,在 Windows 中,在启动操作后询问用户仍然很正常:“你真的想这样做还是那样?”
如果您使用 Unix 命令,则情况并非如此,除非您明确要求要求确认。该rm
命令也不例外,并且知道这样一个参数:-i
或--interactive
。
麻烦始于 2004 年左右,当时由于 Ubuntu 作为易于使用的操作系统的崛起,大量新 Linux 用户迅速涌入。他们所有人都对 Linux 的底层工作原理知之甚少。他们中的许多人都犯了一个错误,导致许多系统因输入错误为 而被删除rm -rf /
。悲伤的时刻...
当时犯的错误是试图“保护”这些用户,就像 Windows 所做的那样。因此像 Ubuntu 这样的发行商引入了别名,它会自动将rm
命令转换为rm -i
.在我看来,向新用户传授 Unix 方法而不是光顾他们会更好。
尽管如此,底线是一些发行版仍然使用这样的别名定义,因此许多人认为交互式查询是该rm
命令的默认设置。然而,这种情况并非如此。
参考
答案2
首先,正如其他人已经说过的,yes | rm -r
与 非常相似但不完全相同rm -rf
。不同之处在于该-f
选项告诉rm
我们继续过去的各种错误。这意味着它将yes | rm -r
在第一个错误时退出,而不是rm -rf
继续并继续删除它可以删除的所有内容。这意味着yes | rm
就是轻微地危险性比 低rm -f
,但也不是那么危险。
那么,您会采取什么措施来降低风险呢rm
?
以下是我养成的一些习惯,这些习惯可以大大降低rm
.这个答案假设你没有别名rm
,rm -i
在我看来这是一个不好的做法。
不要使用交互式 root shell。。这立即使最坏情况变得更加困难rm -rf /
。相反,请始终使用sudo
,这应该是仔细查看您正在键入的命令的视觉线索。如果绝对有必要启动 root shell,请执行您需要的操作并退出。如果有什么事情迫使你在大部分时间都处于 root 状态,请修复它。
警惕绝对路径。如果您发现自己正在键入以 开头的路径/
,请停止。避免绝对路径更安全,而是 cd 到要从中删除的目录,使用ls
并pwd
四处查看以确保您位于正确的位置,然后继续。
在按命令返回之前暂停rm
。我训练自己在输入任何命令(以及其他一些潜在危险的命令)后总是将手指从键盘上抬起rm
,非常仔细地检查我输入的内容,然后才将手指放回键盘并按下返回。
用于echo rm ...
查看您要求rm
执行的操作。我经常rm
通过两步过程来执行关键命令。首先,我输入
$ echo rm -rf ...
这会扩展所有 shell 全局(即*
模式等)并且给我看命令rm
将有被处决了。如果这看起来不错,再次仔细检查后,我键入^P
(control-P) 以恢复之前的输入行,删除echo
,并再次检查命令行,然后按回车键而不更改任何其他内容。
维护备份。如果您执行了上述大部分操作,则必须恢复整个系统的可能性非常低,但您仍然可能会意外删除自己的文件,并且能够很方便地从某个地方取回它们。
答案3
如果您输错了目录名称,甚至rm -r dir
会删除错误的目录,并且不会提出任何问题,除非其中有一个文件缺少写入权限。 (但即便如此,之前的所有内容都会被删除。)
rm -rf dir
和之间的区别yes | rm -r dir
在于,它-f
会覆盖开始时的提示,同时从yes
答案y
到所有提示进行管道传输。这可能会被视为确认删除,但它应该受到区域设置(LC_MESSAGES
)的影响,因此可能在某些区域设置中y
不会确认。 (我在 Debian 上的芬兰语语言环境中进行了测试,英语y
和芬兰语都k
证实了这一点。)
最后,您使用哪一个并不重要。如果您使用其中任何一个,则意味着您不会获得单独的确认,并且如果您删除了错误的文件,则可以从备份中恢复。
我不认为这只是特定于rm
或一般的命令行。在基于 GUI 的文件管理器上也完全有可能在错误的文件或目录上单击“删除”。
巧妙地命名您的文件,保留备份,在删除任何文件之前三思。
如果仍然需要这样做,您可以将其包装rm
到一个函数中,该函数在继续删除之前计数并列出受影响的文件。但这样做是另一个问题。
答案4
不 yes | rm -r
是不是比 更安全rm -rf
。
在全部其尺寸。
Unix 提供的用于擦除文件的主要命令是rm
.还有其他命令也可以删除文件,例如 unlink。但unlink
仅适用于一文件并且不能取消链接一个目录(在 Linux 中)。
所以,rm
是主要工具。并且,本着 UNIX 的精神,做一件事,做得好,rm
可以删除许多文件。摩擦是在哪些文件。因此,rm
(我的意思是您的两个命令行示例)从系统的角度来看是一个完全安全的命令(在两种情况下)。
但这也是一个危险的命令来使用,因为它带有很大的力量。
权力越大,责任越大。
这是不是尝试限制计算机中的此类命令不那么急于删除文件或使用别名 ( rm -i
) 是一个好主意,这会减少危险可能有。因为这样做你习惯有另一层次的保护,一种帮助者。这听起来可能是一件合理的事情。但想一想:您通过 ssh 连接到另一台计算机或坐在朋友计算机上提供帮助,而这些计算机没有此类额外的障碍,并且您发出命令以确保不会发生任何重要的事情,但它确实发生了。
我的智慧之言(我个人的观点)是:
- 习惯这种危险,每次使用 rm 命令时都要小心,从长远来看,你会得到更好的服务。