读完本教程,你将能够删除单个文件、空目录、整个目录树,以及按名称或按时间筛选出的文件,并且每次操作前都先确认目标。Linux 命令行没有回收站,删除即永久删除。因此,操作方法和命令本身一样重要。
前提条件
- 一台可通过 shell 访问的 Linux 机器(本地或 SSH 均可),例如 Linux VPS
- 对目标目录有写权限的用户(或具备
sudo权限) - 对重要数据做过一份较新的备份
删除前先确认目标
先进入正确的目录,再列出其内容。这只需要两秒钟,却能避免大多数事故。
Bashpwd ls -la
如果要按模式(扩展名、前缀)匹配,先看看它会命中哪些文件。rm 展开后使用的正是同一份列表。
Bashls -d *.log
删除单个文件
基本命令是 rm。
Bashrm report.txt
加上 -i 会在删除前要求确认,加上 -v 会显示被删除的内容。
Bashrm -iv report.txt
随后用 ls report.txt 检查:如果提示 “No such file or directory”,说明文件已被删除。
删除多个文件
利用 shell 通配符可以批量匹配。先用 ls 列出,再执行删除。
Bashrm -v *.tmp rm -v photo_{01..05}.jpg
在没有把握的目录里,避免直接使用 rm * 这样的裸通配符。如果文件名以连字符开头,用 -- 标明选项到此结束:
Bashrm -- -strange-file.txt
删除空目录
rmdir 只能删除空目录。这是有意设计的,相当于一道保险。
Bashrmdir old_folder
如果想把因此变空的上级目录一并删除:
Bashrmdir -p project/cache/tmp
删除目录及其全部内容
这时需要递归选项 -r。先估算一下将要损失多少数据。
Bashdu -sh old_project find old_project -type f | wc -l
然后在有确认提示的情况下删除:
Bashrm -ri old_project
当文件数以千计时,逐个确认就不现实了。-f 选项会关闭确认:
Bashrm -rf old_project
切勿在这条命令中使用未经检查的变量。执行 rm -rf "$DIR"/ 时,如果 $DIR 为空,目标就变成了根目录。在脚本中应加上 set -u,或使用 "${DIR:?}",变量为空时它会中止执行。
按文件存在时间删除
find 可以按名称、类型、时间、大小等条件精确筛选。原则是:先不带任何动作地运行,确认无误后再加上 -delete。
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30
如果列出的文件与预期一致:
Bashfind /var/log/myapp -type f -name "*.log" -mtime +30 -delete
-mtime +30 表示修改时间在 30 天以前的文件。务必把 -delete 放在最后:find 从左到右依次计算条件,-delete 放得太靠前会删除所有内容。
更稳妥地擦除敏感文件
rm 移除的是文件的目录项,并不一定会清除磁盘上的数据。shred 会在删除前覆写文件内容。
Bashshred -u -v secret.key
在 SSD、日志型文件系统或带快照的卷上,这种方法有局限,旧数据仍可能残留。对于真正敏感的数据,从一开始就使用磁盘加密才是可靠的办法。
排查常见错误
Permission denied
你对父目录没有写权限(决定能否删除的是父目录,而不是文件本身)。用 ls -ld DIRECTORY 检查,如果确属合理操作,再使用 sudo:
Bashsudo rm -v /path/to/file
Operation not permitted,即使使用 sudo
文件很可能带有不可变属性。先查看,再去除,然后删除。
Bashlsattr file.txt sudo chattr -i file.txt sudo rm file.txt
Argument list too long
通配符展开后的参数数量超过了系统允许的上限。改用 find,它会逐个处理文件:
Bashfind . -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)实现,它会把项目移入用户的回收站,而不是直接删除。服务器上通常不会默认安装,所以最好养成先列出、再删除的习惯。