最近在网上看到一张图(原图出处不详,题图据原图重制,有修改。)

唔,感觉很有道理啊,你看,rm 是删除,这个单词简单好记;连 rf 都给出了解释,“垃圾文件”;/* 代表目录下的所有文件,没毛病;sudo 也有了,确保权限没问题。

哈哈,你一定会说,又编段子搞笑,没人会信的。

会有人执行这样的命令来清理所谓的垃圾文件么?你别说,这还真不好说。

我们经常会发一些关于关于 Bash 别名的文章,总有一些同学皮一下“贡献”一些别致的别名,比如 alias ls=rm -rf,alias cd=rm -rf 等等。虽然我认为几乎没有人会被这些命令恶搞,但是大家也屡屡乐此不疲。

我将这张图发到朋友圈里,好友“龙十三”表示,这不仅仅清除垃圾文件,而且清除垃圾系统管理员。

是啊,为什么会有这样的段子一再出现呢?就是因为我们有些不求甚解的人,遇到问题了,习惯于从网上随便找个命令示例瞎试,不去探究其原理,也不去核实可靠性。所以,这样的段子真是用来清除“系统管理员里的垃圾”的。

那么让我们来探究一下上面这条命令,看看这里有多少知识点。

rm 的那些事

首先,这条命令是用来清除 Linux 系统的根目录(/)下所有文件的。它使用了两个命令选项:

-r:递归(recursive),对目录及其下的内容进行递归操作

-f:强制(force),无需确认操作

这两个选项可以单独写作 -r 和 -f ,也可以按 POSIX 惯例,将两个选项合并成 -rf 。这里的 -r 和 -f 选项,绝非上图中恶搞的 “Rubbish” 和 “Files”。

其后的参数 /* 指的是根目录 / 下的所有文件。

-r 选项

-r 选项代表递归(recurive),其意思是指递归地对参数中的目录及其下的文件或子目录进行删除操作。

这个选项除了短选项风格,还有 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 系统的经验并不值得复制。

好了,关于这个简单的命令,我们已经挖掘了这么多知识点,你都知道了吗?

事实上,关于这些知识,还有更多的内涵、外延和历史信息,作为一个真正的系统管理员,而不是一个脚本小子,需要认真地研究每个命令和细节。

【编辑推荐】

【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0

linux管理员清理主目录,在Linux上如何清理垃圾系统管理员相关推荐

  1. Linux管理员易犯的错误

    对于初入linux的管理员们来说,迁移到Linux是一场噩梦,而且在Linux管理中稍微不小心就会出错,如果不避免这些错误的话就会给我们的网络和系统带来风险,那么我们现在就去看看Linux管理员易犯的 ...

  2. Linux上如何清理内存缓存、缓冲与交换空间?

    [推荐阅读] 浅析linux内核网络协议栈--linux bridge 深入理解SR-IOV和IO虚拟化 深入linux内核架构--进程&线程 与其他类型的操作系统一样,GNU/Linux已经 ...

  3. xp linux 桌面快捷方式,清理WinXP系统桌面上的快捷方式图标(转)

    清理WinXP系统桌面上的快捷方式图标(转)[@more@] 在电脑的使用过程中,桌面上的快捷方式图标会随着软件的安装不断增多,桌面会看起来比较杂乱无章,有时候还会降低计算机的启动速度.要是将他们全部 ...

  4. “懒惰”Linux 管理员的 10 个关键技巧

    "懒惰"Linux 管理员的 10 个关键技巧 来源:Vallard Benincosa 分享到:更多0 好的系统管理员区分在效率上.如果一位高效的系统管理员能在 10 分钟内完成 ...

  5. _效率高的Linux管理员都会的10个关键技巧

    好的系统管理员区分在效率上.如果一位高效的系统管理员能在 10 分钟内完成一件他人需要 2 个小时才能完成的任务,那么他应该受到奖励(得到更多报酬),因为他为公司节约了时间,而时间就是金钱.以下这些技 ...

  6. 提升效率! Linux 管理员必用的10个关键技巧

    点击上方"民工哥技术之路",选择"设为星标" 回复"1024"获取独家整理的学习资料! 好的系统管理员区分在效率上.如果一位高效的系统管理员 ...

  7. Linux管理员面试题大全

    1 服务器的linux系统是什么版 2 linux你做过那些优化 3 在linux上部署过那些服务 4 你怎样用nagios做的监控,监控什么? 5 用cacti怎样对网络进行监控?以前公司的情况(问 ...

  8. linux添加服务命令行,Linux系统自有服务(上)

    系统自有服务(上).md Linux系统自有服务 自有服务,即不需要用户独立去安装的软件的服务,而是当系统安装好之后就可以直接使用的服务(内置) 学习目标 1.了解Linux的7种运行模式 2.了解用 ...

  9. 工作效率高的 Linux 管理员都会的 10 个关键技巧

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 好的系统管理员区分在效率上.如果一位高效的系统管理员 ...

最新文章

  1. iOS autolayout 约束冲突添加symbol breakpoint
  2. 为什么U-Net在医学图像上表现优越?
  3. Redis线程模型的前世今生
  4. will_paginate 用作查询分页的注意事项
  5. 201771010106东文财《面向对象程序设计(java)》实验12
  6. [Spring cloud 一步步实现广告系统] 17. 根据流量类型查询广告
  7. 二、SpringMVC的常用注解——1-@Controller
  8. 概率论 第四章 随机变量的数字特征
  9. Jquery 获取select,radio 和 checkbox的值
  10. Java中Collection与Collections的区别
  11. 查询:使用多表连接查询数据
  12. 编写一个Java应用程序,从键盘读取用户输入两个字符串,并重载3个函数分别实现这两个字符串的拼接、整数相加和浮点数相加。要进行异常处理,对输入的不符合要求的字符串提示给用户,不能使程序崩溃。
  13. 序列化和反序列化_PHP序列化和反序列化
  14. 安卓平台中的动态加载技术分析
  15. 深度学习pytorch基础入门教程(1小时)-神经网络
  16. face_recognition基础接口
  17. ppt地图分布图一块一块的怎么做_没想到PPT还能这样做动态地图,实在是太炫酷了,用了再也离不开...
  18. 巴特沃斯(Butterworth)滤波器的设计和幅频特性曲线绘制
  19. 计算机 模板 样式 母版,电脑PPT软件的母版怎么设置
  20. strlen函数原理

热门文章

  1. Visio的VBA初探
  2. WebForm-博客园-1.0-账户模块(Passport)-登录与注册
  3. 源码编译安装httpd服务
  4. 可穿戴在线展持续升温:聚焦产业热点 畅谈核心技术发展
  5. Java循环删除集合多个元素的正确打开方式
  6. 实现CStack类遇到的问题
  7. iOS中常用的正则表达式
  8. python代码制作configure文件
  9. python中定义结构体
  10. SpringBoot版本:1.5.12.RELEASE 文件大小限制异常拦截网关zuul报错