最近在网上看到一张图(原图来源不明,题图按原图转载,有修改。)嗯,感觉很有道理,看,rm是删除,这个词简单好记;连rf都给出了解释,“垃圾文件”;/*代表目录下的所有文件,没有错;sudo也是可以的,保证权限没问题。哈哈,你肯定会说的,再编个笑话,没人会信的。会有人执行这样的命令来清理所谓的垃圾文件吗?别说了,真的很难说。我们经常会发一些关于Bash别名的文章,总有一些同学“贡献”一些独特的别名,比如aliasls=rm-rf,aliascd=rm-rf等等。虽然我认为没有人会被这些命令愚弄,但每个人都一遍又一遍地享受它。我把这张图发到朋友圈,朋友“龙十三”说这样不仅能清除垃圾文件,还能清除垃圾系统管理员。是啊,为什么这样的笑话屡屡出现呢?是因为我们一些不太了解的人遇到问题,习惯了从网上随便找命令例子,盲目尝试,没有探究原理,也没有验证可靠性。所以,这样的笑话真的是用来清理“系统管理员里的垃圾”的。那么我们来探究一下上面的命令,看看有多少知识点。首先,该命令用于清除Linux系统根目录(/)下的所有文件。它使用了两个命令选项:-r:recursive(递归),对目录及其内容进行递归操作-f:force(强制),无需确认操作这两个选项可以分别写成-r和-f,它也可以根据POSIX约定将这两个选项组合到-rf中。这里的-r和-f选项绝对不是上图中恶搞的“Rubbish”和“Files”。后面的参数/*指的是根目录/下的所有文件。-r选项-r选项代表递归,表示递归删除参数中的目录及其下的文件或子目录。该选项除了短选项风格外,还有GNU风格的长选项--recursive;出于兼容性原因,还支持同义大写-R参数。如果没有此选项,则不会删除目录及其内容。-f选项在介绍-f选项之前,我们先来看看这里没有出现的-i选项。原生rm命令在删除文件或目录时遵循UNIX约定,在删除操作成功前后无提示无提示。永远不要抱怨,除非遇到错误(比如被删除的文件不存在)。后来,可能因为很多人经常误删文件,大部分Linux发行版上的rm命令都是加了-i选项的别名:aliasrm=rm-i其中-i选项是用来在删除动作前做一个提示,用户在删除前需要明确确认。然而,有时候,这种提示确实很烦人,所以很多人在操作时故意使用-f选项来覆盖-i选项的行为,使得这个别名的定义变得毫无意义。因此,还有一个-I选项,在删除三个及以上文件或递归删除时,会做出确认提示。这样,它不像-i选项那么烦人,并且可以防止大多数误用。因此,上述别名可以与-I选项一起使用,避免使用-f选项。*什么是通配符?我们看到*在命令中指的是目录下的所有文件。但严格来说,*通配符代表所有不以点“.”开头的文件。以“.”开头的文件Linux下默认是隐藏文件。因此,该命令不会删除以.开头的隐藏文件。在/目录中,以及两个目录中。和...但是,在递归操作过程中,子目录下的所有文件和子目录除.和..目录将被递归删除——无论它们是否以.或不——因为递归操作不是由Bash等shell执行的。至于为什么。和..在删除目录内容时不是一视同仁吗?因为从1979年开始,当rm命令有删除目录的能力时,就特意避开了这两个特殊的目录。对根目录保护有一定经验的系统管理员这时候可能会想起rm命令有一对根目录的选项--preserve-root和--no-preserve-root。这对选项的含义:--preserve-root:保护根目录,这是默认行为。--no-preserve-root:不保护根目录。这对选项是后来添加到rm命令中的。大概每个系统管理员都犯过操作错误,删除根目录的大有人在(我就是其中之一)。出现这种情况的原因有以下几种:输入错误:比如我想输入rm/tmp/test.txt,但是不小心键盘飞起来了,多输入了一个空格变成了:rm/tmp/test.txt。看到根目录(/)后的空格了吗?!-这是我目前在生产服务器上犯的错误。错误初始化或错误命名的shell脚本变量:例如,在脚本rm-rf/${tmp_dir}中,如果tmp_dir变量被错误分配或输入错误(也许是tmpdir?),会发生什么?当然是删除根目录~鉴于这种情况的层出不穷,几乎成了Linux圈里“初学者如何退出vi”这样的经典笑话。因此,在POSIX第七版规范中,rm命令添加了--preserve-root选项并使其成为默认行为,以减少此类错误的可能性。但是,此选项不能防止清除根目录(/*)中的所有文件,如本文所述。可能有同学会问,为什么会特意出现--no-preserve-root这个选项呢?这可能主要是由于UNIX的哲学,给你想要的一切权力,愚蠢是你的事,而不是操作系统的事。如果,你真的想删除根目录下的所有文件怎么办?还别说,还真有这样的需求:比如你想清除chroot环境下的所有文件。chroot这里就不多说了。它使用目录作为“监狱”。这个目录在逻辑上形成了一个新的“根目录”。对本牢的文件操作不能超出本目录范围。近几年流行的Docker、LXC/LXD等容器技术都是chroot技术。UEFI系统嘛,你可能比较特立独行,清空物理环境根目录下的所有文件即可!但在你按下回车键之前,再想一想,你是在UEFI系统上吗?因为UEFI系统将它们的固件、变量和设置映射到根目录下的/sys分区,如果你在UEFI环境下清除根目录下的所有内容,/sys也会被清除,这可能会导致你丢失估计的UEFI设置,使设备变砖。sudo提权为了删除属于root和其他系统以及其他用户的文件,这个命令也需要在sudo之前提权。输入此命令后,系统会要求您输入密码。谁的密码?不是root密码,而是当前用户输入命令的密码。至于谁可以执行sudo命令,他可以通过sudo命令执行什么命令等知识点,这里不再赘述,可以参考我们的其他文章。对了,记得区分sudo和su命令的连接和区别。垃圾文件研究到这里,我们不能忘记这个命令的初衷,删除“垃圾文件”。Linux下有垃圾文件吗?有。这些垃圾文件一般来自:未被包管理器管理的孤儿文件,删除包后留在系统中的无用依赖包,以及需要这些依赖包的软件删除后没有删除或清理的文件临时文件遗留下来的诊断文件,这些垃圾文件需要清除吗?一般来说,Linux系统上的这些文件,大部分不会对系统的健康运行造成任何影响,除非数量太多,占用大量的存储空间和inode。所以,如果你觉得你的Linux系统很慢,那几乎可以肯定不是因为垃圾文件,至少在这一点上,Windows系统的体验不值得复制。好了,关于这个简单的命令,我们挖出了这么多的知识点,你都知道了吗?其实,这方面的知识还有更多的内涵、外延和历史资料。作为一个真正的系统管理员,而不是脚本小子,你需要仔细研究每一个命令和细节。
