零、前言
和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即可生效。
- 【原创】转载请注明出处
文章评论