在 Linux 运维或开发过程中,删除文件和目录是最常见的操作之一。但如果使用不当,很容易造成误删甚至系统故障。本文系统介绍 Linux 中删除文件与目录的常用方法,并给出实际运维中的安全技巧。
一、删除文件:rm 命令
Linux 删除文件最常用的命令是 rm(remove)。
1 删除单个文件
rm file.txt
执行后文件会被直接删除,不会进入回收站。
2 删除多个文件
rm file1.txt file2.txt file3.txt
也可以使用通配符:
rm *.log
表示删除所有 .log 文件。
3 删除前进行确认
为了避免误删,可以使用 -i 参数:
rm -i file.txt
系统会提示:
rm: remove regular file 'file.txt'?
输入 y 才会删除。
二、删除目录
目录删除通常需要递归删除。
1 删除空目录
rmdir dir
注意:如果目录中有文件,会删除失败。
2 删除非空目录
最常用命令:
rm -r dir
参数说明:
| 参数 | 含义 |
|---|---|
| -r | 递归删除 |
| -f | 强制删除 |
| -i | 删除前询问 |
3 强制删除目录(最常见)
rm -rf dir
这是 Linux 运维中最常见的删除命令。
⚠️ 非常危险
rm -rf /
会删除整个系统。
三、删除目录中的所有文件
如果要清空某个目录:
rm -rf /data/*
但这个命令 不会删除隐藏文件。
删除隐藏文件
Linux 中隐藏文件以 . 开头。
.cache
.config
删除隐藏文件可以使用:
rm -rf /data/.* /data/*
但这种方式容易出问题,因此不推荐。
四、使用 find 删除文件
在实际运维中,find 是更安全和强大的删除工具。
1 删除某类文件
例如删除所有 .log 文件:
find /data -name "*.log" -delete
2 删除 7 天前的日志
find /data/logs -mtime +7 -delete
| 参数 | 含义 |
|---|---|
| -mtime | 按修改时间 |
| +7 | 7 天之前 |
3 删除大文件
例如删除大于 100MB 的文件:
find /data -size +100M -delete
五、删除文件但排除某个目录
这是实际运维中非常常见的需求。
例如清空当前目录,但保留 keepdir。
错误示例
find . -mindepth 1 ! -name keepdir -exec rm -rf {} +
问题是:
-name keepdir 只匹配目录本身,不会排除里面的文件。
keepdir/file1
keepdir/file2
仍然会被删除。
正确方法:使用 prune
find . -path ./keepdir -prune -o -mindepth 1 -exec rm -rf {} +
| 参数 | 作用 |
|---|---|
| -prune | 停止遍历目录 |
| -o | 否则执行 |
| -mindepth 1 | 避免删除当前目录 |
删除前先查看
find . -path ./keepdir -prune -o -mindepth 1 -print
确认无误后再执行删除。
六、排除多个目录
例如保留:
keepdir
logs
backup
find . \( -path ./keepdir -o -path ./logs -o -path ./backup \) -prune -o -mindepth 1 -exec rm -rf {} +
七、使用 Bash 排除目录
开启扩展:
shopt -s extglob
删除除 keepdir 外的所有内容:
rm -rf !(keepdir)
但这种方法:
- 只适用于 bash
- 不适用于所有 shell
八、运维中常见的安全技巧
1 删除前先查看
find ... -print
2 防止误删根目录
rm --preserve-root
3 给 rm 加别名
alias rm='rm -i'
九、快速清空大目录(运维技巧)
当目录文件非常多时:
rm -rf
可能会很慢。
更快的方法:
find /data -mindepth 1 -delete
十、总结
| 场景 | 命令 |
|---|---|
| 删除文件 | rm file |
| 删除目录 | rm -r dir |
| 强制删除 | rm -rf dir |
| 删除某类文件 | find -name |
| 按时间删除 | find -mtime |
| 排除目录删除 | find -prune |
| 清空目录 | find -mindepth 1 -delete |
最重要的一条原则
删除操作不可恢复。
因此在执行删除命令之前:
- 先确认路径
- 先打印结果
- 再执行删除
这也是 Linux 运维中最基本的安全习惯。