Tzchz's Blog

Tzchz's Blog
Enjoy coding life
  1. 首页
  2. vps
  3. 正文

以免又手滑mv敲成rm:用alias给Linux加个“回收站”

2025年9月25日 239点热度 1人点赞 0条评论

零、前言

和GUI环境相比,命令行是个危险的世界。用一句前段时间看到(不过似乎不是那么恰当)的话来类比,它“略去了前端,只留下后端”。翻译成人话就是,只要没有语法错误无法继续,命令行总会坚定地执行你的命令,不再二次质疑。

(本来想再放点rm相关梗图的,省略脑补~😂)

一、通过alias将rm指向mv命令

通过运行下面的命令,可以把rm改为“mv到回收站(指定目录)”的操作。

alias rm='DIR=/.trash/rm.`date +%F.%T`;mkdir $DIR;mv -t $DIR'

以上命令中各参数的简单解释:

  • date +%F.%T:回收站中允许存在同名的文件或目录,创建一个以当前日期时间命名的目录,避免文件名冲突;
  • mv -t $DIR:为了书写的简练,交换源文件/目录和目标目录在命令中的位置,因此上面的这个版本是目前较为主流的做法。

这样,每次敲rm xxx(xxx为一个或多个文件或目录)的时候,它实际上就是被移动到了/.trash/rm.TIMESTAMP/目录的下面。

二、解决rm -rf中的-rf参数

很显然,修改后的rm命令不需要(也不支持)携带-rf参数。一般来讲,alias之后我们删除时不再敲-rf参数就可以了;但是如果经常使用到一些可能包含带-rf参数的脚本而不是手敲命令,还是处理一下比较好。

最可能想到的方法应该是让alias先去“匹配、替换”rm -rf,然后再在剩下的命令中匹配rm。这种思路是非常经典的,但是很遗憾alias是基于命令名匹配的,并不支持像“rm -rf”这样“匹配”任意一段字符串的想法。

这个问题并没有非常简练的解决方案,目前很多方法是选择编写一个完整的脚本而不是使用alias;不过最近看到了另一个比较创新的方案:

alias rm='f() { D=/.trash/rm.$(date +%F.%T); mkdir -p "$D"; for i in "$@"; do [[ "$i" == -* ]] || mv "$i" "$D"; done; }; f'

虽然没有那么完美,但是相对编写独立的脚本来说代码还是简洁了很多。为了提高可读性,下面也放上还原回多行写法时的代码:

alias rm='f() {
  D=/.trash/rm.$(date +%F.%T)
  mkdir -p "$D"
  for i in "$@"; do
    [[ "$i" == -* ]] || mv "$i" "$D"
  done
}; f'

需要注意的是,添加的这个临时函数的原理是忽略掉所有-后面的参数,这包括-rf和其他内容。

三、将命令写入.bashrc

上述的命令执行后立即就会生效,但是会在当前会话时失效。要在每次打开终端时都自动生效,只需要将其添加到~/.bashrc文件的末尾就可以了。

保存后,执行

source ~/.bashrc

或者关闭现有的会话并重新打开shell即可生效。

  • 【原创】转载请注明出处
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: vps
                               发布于 2025年9月25日

tzchz

个人主页:https://chz.asia

打赏 点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

tzchz

个人主页:https://chz.asia

About me
  • Tzchz Home
  • Tzchz’s NoteBook
  • Tzchz’s GitHub
  • Online Apps
My friends
  • 道之远兮
  • YF's Blog
  • 树 - 洞
  • 一颗柚子

COPYRIGHT © 2018 - 2025 TZCHZ'S BLOG. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY SEATON JIANG