linux删除文件

最近对 rm 命令有些恐惧,整理了一下比较安全的删除方式。

rm 命令

交互式删除文件时,下面几个选项可以提高安全性。

  • -I : 当删除3个文件以上,或者存在 -r 选项(递归删除文件夹)时提醒一次
  • -i :每个文件均提醒一次(因为麻烦所以容易不使用这个选项,人性的懒惰)
  • -v :给出具体删除文件的信息

另外先跑下面的命令也更加容易避免误删的情况

1
2
3
pwd # 先确认当前目录
ls # 确认当前目录有啥
echo rm ... # 先打印一下 rm 命令,确认一遍

rm 命令的潜在危险

在我看来,所有其他 linux 命令和 python/R 脚本对我来说都是可重复的(这一点很重要),只要保留原始文件,跑错了重新跑就行。

但是,如果一旦误用了 rm 命令,那就是不可重复了,这就是 rm 命令的潜在危险。

有人说 rm -rf 危险,我不这样认为,因为不可能每次都交互式删除文件。在非交互式删除文件的时候,我们往往使用相对路径来删除文件和文件夹。因此下面3点才是危险的。

  1. 不确认当前目录(PWD),就删除文件。

  2. 使用太宽泛的通配符匹配,比如下面三种写法,第一种写法是绝对不能用的,肯定会误删,这种最好的写法是第三种(最好先 ls slurm-*.log 看一下再删 )。

    匹配的文件或文件夹最好越详细越好,甚至不用 * 号最好,因为越详细越不会错误匹配别的文件,而如果没有匹配的文件,rm 什么都不会做。

    1
    2
    3
    rm * 
    rm *.log
    rm slurm-*.log
  3. 路径中含有变量,因为变量可能没有赋值,比如运维的地狱笑话命令,如果下面命令中 path 没有赋值,那就成了删除根目录的全部文件。因此最好别用变量,变量要是没有赋值可能会出事。

    1
    rm -rf $path/*

回收桶

Linux 上最常见的就是 trash-cli(很多发行版/conda 里可用)

安装命令如下

1
2
3
4
5
6
7
8
9
# 安装
conda install -c conda-forge trash-cli

# 日常用法:把“删除”变成可回收
trash 文件或目录
# 查看
trash-list
# 恢复
restore-trash

安装后, trash-cli一组独立命令,每个都有自己的 -h(但是我看还是有一个 trash 命令,是 trash-put 的缩写):

1
2
3
4
5
6
# 通用帮助(每个命令都一样)
trash-put --help
trash-list --help
trash-restore --help
trash-empty --help
trash-rm --help

作用如下

命令 作用 类比
trash-put 删(送回收站) 替代 rm
trash-list 查看回收站里有什么 ls回收站
trash-restore 交互式恢复 从回收站还原
trash-empty 清空回收站(永久删) 清空
trash-rm 从回收站删指定项 选择性永久删

删除文件直接删除就是了(我下载的版本中,trashtrash-put 为了输入方便的快捷版本)

1
2
3
4
5
6
7
8
9
10
11
# 删文件
trash-put foo.txt

# 删目录(不需要 -r!直接写就行)
trash-put mydir/

# 删一批
trash-put *.log *.tmp

# 看它干了啥
trash-put -v foo.txt

rm最大区别:不需要 -rf,目录直接删,而且进回收站不是真消失。

查看回收站

1
trash-list

恢复文件(最重要)

1
2
trash-restore
trash-restore dir # 指定路径时显示该路径下删除的文件

会弹出交互菜单:

1
2
3
0  2026-03-21 14:30:00 /home/you/project/foo.txt
1 2026-03-21 14:25:00 /home/you/project/old_data/
What file to restore [0..1]:
  • 输入编号回车 → 恢复到原路径
  • 支持 0-10,2这样的多选
  • 原路径已有同名文件时加 --overwritetrash-restore --overwrite

清空回收站

1
2
3
4
5
# 全部清空(慎用)
trash-empty

# 只清 30 天前的(推荐日常用)
trash-empty 30

从回收站删特定项(不恢复,直接永久删)

1
2
3
4
5
6
# 按通配符
trash-rm '*.tmp'
trash-rm '*.log'

# 按原始路径
trash-rm '/home/you/project/old_data'

注意:trash-rm的参数要加引号,否则 shell 会先展开。

回收站文件实际在哪?

1
2
ls ~/.local/share/Trash/files/
ls ~/.local/share/Trash/info/ # 元数据(含原始路径)

每个文件在 info/里有个 .trashinfo文件记录原路径和删除时间,这就是 trash-list的数据来源。

我目前的策略

  • 脚本里面还是用 rm 删除中间文件,不过最好写清楚删除文件的名称,少用通配符。
  • 交互式删除文件时使用 trash-put ,这种一般是删除小文件。
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2026 Vincere Zhou
  • 访问人数: | 浏览次数:

请我喝杯茶吧~

支付宝
微信