跟老男孩学Linux运维:核心系统命令实战
上QQ阅读APP看书,第一时间看更新

2.9 rm:删除文件或目录

2.9.1 命令详解

【命令星级】 ★★★★★

【功能说明】

rm命令可以理解为英文单词remove的缩写,其功能是删除一个或多个文件或目录(remove files or directories)。这是Linux系统里最危险的命令之一,请慎重使用。

【语法格式】

rm  [option]  [file]
rm  [选项]    [<文件或目录>]

说明:

rm命令以及后面的选项和文件目录,每个元素之间都至少要有一个空格。

【选项说明】

表2-12针对该命令的参数选项进行了说明。

表2-12 rm命令的参数选项及说明

2.9.2 使用范例

示例准备:

[root@oldboy ~]# mkdir -p /data/{dir1,dir2,dir3} #<==使用绝对路径创建目录。
[root@oldboy ~]# touch /data/{file1.txt,file2.txt,file3.txt}
[root@oldboy ~]# tree /data/
/data/
├── dir1
├── dir2
├── dir3
├── file1.txt
├── file2.txt
└── file3.txt
3 directories, 3 files
[root@oldboy ~]# cd /data/
[root@oldboy data]# ls
dir1  dir2  dir3  file1.txt  file2.txt  file3.txt

范例2-45:不带参数删除例子实践。

[root@oldboy data]# rm file3.txt
rm: remove regular empty file 'file3.txt'? n
#<==输入y后就会删除文件,不想删除则输入n。
[root@oldboy data]# alias rm
alias rm='rm -i'  #<==上面会出现提示的原因是rm设置了系统别名,默认使用了-i参数。
#<==屏蔽别名的方法已经在cp命令讲解中介绍过,这里不再赘述。

范例2-46:强制删除例子实践。

[root@oldboy data]# rm -f file3.txt #<==-f参数强制删除,不提示。
[root@oldboy data]# ls
dir1  dir2  dir3  file1.txt  file2.txt

提示:使用-f参数强制删除会直接覆盖系统定义的别名。

范例2-47:递归删除例子实践。

[root@oldboy data]# mkdir -p dir1/a/b
[root@oldboy data]# tree dir1/
dir1/
└── a
    └── b
2 directories, 0 files
[root@oldboy data]# rm dir1    #<==无参数就无法删除目录了。
rm: cannot remove 'dir1': Is a directory
[root@oldboy data]# rm -r dir1 #<==使用-r可以递归删除,但会有确认提示,可以使用-f强
                                  制删除。
rm: descend into directory 'dir1'? y
rm: descend into directory 'dir1/a'? y
rm: remove directory 'dir1/a/b'? n
#<==备注:
加上-f参数就不需要一一确认了,例如rm -rf dir1。
删除的对象若不是目录(文件)就不要使用-r参数,这样做会很危险,也没有必要。

2.9.3 关于删除的实践经验

常在河边走,哪有不湿鞋!但是如果能遵守下面的要领就可以少湿鞋甚至不湿鞋!

1)用mv替代rm,不要急着删除,而是先移动到回收站/tmp。

2)删除前务必备份,最好是异机备份,若出现问题随时可以还原。

3)如果非要删除,那么请用find替代rm,包括通过系统定时任务等清理文件方法。下面是在生产环境中删除文件或目录的较安全方法:

find . -type f -name "*.txt" -mtime +7|xargs rm –f      #<==与xargs搭配使用,具体
                                                     用法见find命令讲解。
find . -type f -mtime +7 -exec rm {} \;            #<==使用find的exec。

4)如果非要通过rm命令删除,那么请先切换目录再删除,能不用通配符的就不用通配符。对文件的删除禁止使用“rm-rf文件名”,因为“rm-rf”误删目录时并不会有提示,非常危险。最多使用“rm-f文件名”,推荐用“rm文件名”。

[root@oldboy /]# cd /oldboy/
[root@oldboy oldboy]# rm -f test1 test2

5)如果非要用通配符,请按下面方法:

[root@oldboy /]# cd /oldboy/
[root@oldboy oldboy]# rm -f ./*  #<==加上"./"。
#<==禁止使用rm -fr /oldboy/*,这个命令如果多加了空格可能会带来灾难。
[root@oldboy /]# rm -fr /oldboy/*
#<==“*”的前面不小心多了空格,会删除当前目录的所有内容,例如下面的命令。
[root@oldboy /]# rm -fr /oldboy/ * #<==会把当前目录(根)下面的目录全部删除。

6)额外再补充一点,要慎用“rsync--delete”。

大多数情况下,数据删除后是可以恢复的(例如:可通过恢复工具ext3grep来实现),但一定会影响业务,例如:造成停机,或者数据丢了较长时间,用户访问不了等。未雨绸缪永远比发生了再解决要好得多。

更多内容可参考老男孩博文:http://oldboy.blog.51cto.com/2561410/1687300