中文

在 Linux 命令行中删除文件和目录:rm、rmdir 与 find 用法

1 min
VPS/VDS 主机

读完本教程,你将能够删除单个文件、空目录、整个目录树,以及按名称或按时间筛选出的文件,并且每次操作前都先确认目标。Linux 命令行没有回收站,删除即永久删除。因此,操作方法和命令本身一样重要。

前提条件

  • 一台可通过 shell 访问的 Linux 机器(本地或 SSH 均可),例如 Linux VPS
  • 对目标目录有写权限的用户(或具备 sudo 权限)
  • 对重要数据做过一份较新的备份

删除前先确认目标

先进入正确的目录,再列出其内容。这只需要两秒钟,却能避免大多数事故。

Bash
pwd ls -la

如果要按模式(扩展名、前缀)匹配,先看看它会命中哪些文件。rm 展开后使用的正是同一份列表。

Bash
ls -d *.log

删除单个文件

基本命令是 rm。

Bash
rm report.txt

加上 -i 会在删除前要求确认,加上 -v 会显示被删除的内容。

Bash
rm -iv report.txt

随后用 ls report.txt 检查:如果提示 “No such file or directory”,说明文件已被删除。

删除多个文件

利用 shell 通配符可以批量匹配。先用 ls 列出,再执行删除。

Bash
rm -v *.tmp rm -v photo_{01..05}.jpg

在没有把握的目录里,避免直接使用 rm * 这样的裸通配符。如果文件名以连字符开头,用 -- 标明选项到此结束:

Bash
rm -- -strange-file.txt

删除空目录

rmdir 只能删除空目录。这是有意设计的,相当于一道保险。

Bash
rmdir old_folder

如果想把因此变空的上级目录一并删除:

Bash
rmdir -p project/cache/tmp

删除目录及其全部内容

这时需要递归选项 -r。先估算一下将要损失多少数据。

Bash
du -sh old_project find old_project -type f | wc -l

然后在有确认提示的情况下删除:

Bash
rm -ri old_project

当文件数以千计时,逐个确认就不现实了。-f 选项会关闭确认:

Bash
rm -rf old_project

切勿在这条命令中使用未经检查的变量。执行 rm -rf "$DIR"/ 时,如果 $DIR 为空,目标就变成了根目录。在脚本中应加上 set -u,或使用 "${DIR:?}",变量为空时它会中止执行。

按文件存在时间删除

find 可以按名称、类型、时间、大小等条件精确筛选。原则是:先不带任何动作地运行,确认无误后再加上 -delete。

Bash
find /var/log/myapp -type f -name "*.log" -mtime +30

如果列出的文件与预期一致:

Bash
find /var/log/myapp -type f -name "*.log" -mtime +30 -delete

-mtime +30 表示修改时间在 30 天以前的文件。务必把 -delete 放在最后:find 从左到右依次计算条件,-delete 放得太靠前会删除所有内容。

更稳妥地擦除敏感文件

rm 移除的是文件的目录项,并不一定会清除磁盘上的数据。shred 会在删除前覆写文件内容。

Bash
shred -u -v secret.key

在 SSD、日志型文件系统或带快照的卷上,这种方法有局限,旧数据仍可能残留。对于真正敏感的数据,从一开始就使用磁盘加密才是可靠的办法。

排查常见错误

Permission denied

你对父目录没有写权限(决定能否删除的是父目录,而不是文件本身)。用 ls -ld DIRECTORY 检查,如果确属合理操作,再使用 sudo:

Bash
sudo rm -v /path/to/file

Operation not permitted,即使使用 sudo

文件很可能带有不可变属性。先查看,再去除,然后删除。

Bash
lsattr file.txt sudo chattr -i file.txt sudo rm file.txt

Argument list too long

通配符展开后的参数数量超过了系统允许的上限。改用 find,它会逐个处理文件:

Bash
find . -maxdepth 1 -type f -name "*.tmp" -delete

Directory not empty 或 Device or resource busy

使用 rmdir 时,第一条提示属于正常现象:目录中还有文件,包括隐藏文件(用 ls -A 查看)。如果某个挂载点或进程正在占用该目录,用 lsof +D DIRECTORY 或 findmnt 找出来,释放后再重试。

想要零风险地练习,可以用一台随时可丢弃的实例:在 VPS 上建一个测试目录,出错也没有任何后果。更多同类指南收录在教程栏目中。

FAQ

用 rm 删除的文件还能恢复吗?

很少能恢复,而且没有保证。如果你立即停止向该磁盘写入,extundelete 或 testdisk 之类的工具有时能找回数据。唯一可靠的保护手段仍然是备份。

rm -r 和 rm -rf 有什么区别?

rm -r 递归删除,但遇到写保护的文件会要求确认。rm -rf 会强制删除,并且对不存在的文件不报任何提示。只在你已经确认过目标的情况下使用它。

如何删除名称中含有空格的目录?

用引号把名称括起来,或者对空格进行转义:rm -r "My folder" 或 rm -r My\ folder。否则 shell 会把每个单词当作独立的参数。

命令行里有回收站吗?

有,可以通过 trash-cli 软件包(命令为 trash-put)实现,它会把项目移入用户的回收站,而不是直接删除。服务器上通常不会默认安装,所以最好养成先列出、再删除的习惯。

及时了解最新的优惠、折扣和特别促销活动。

查看促销

我们使用Cookie

我们使用分析性Cookie来改善您在我们网站上的体验。数据不会出售给第三方。了解更多请查看我们的 隐私政策.