但是,有时候,这种提示实在是太烦了,所以,很多人在操作时,特意使用 -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 技术 。
推荐阅读
- 电脑耳机没声音是什么原因 耳机没声音怎么设置
- 电脑键盘怎么代替鼠标 可用键盘代替
- 操作系统与浏览器排名 最好的电脑操作系统
- 笔记本电脑怎么打开 如何给笔记本电脑开机
- 数码知识:oppor17怎么连接电脑连接电脑的步骤
- 白色反皮绒衣服怎么清理 白色反皮绒衣服如何清理
- win10平板电脑排行榜 微软平板哪个好
- 笔记本太暗了怎么调亮图文步骤 怎么调节笔记本电脑亮度
- 电脑闪屏怎么办 电脑闪屏如何解决
- 怎么清理微信缓存 怎样使用微信