在Linux中,rm是一个高效的工具,但是有时能带来灾难性的后果。敲一个​​rm -rf *​​​就可能让今天的工作白做了,及时发现问题的话用​​debugfs​​​也许能挽回损失,但是万一,万一磁盘数据被覆盖了呢?
接下来,做点事儿改变一下rm的行为。

1. 创建myrm脚本

因为exit会使得子shell退出,如果将此脚本写成一个函数放到​​.bashrc​​的话,中间一旦出错就会导致终端窗口关闭。故单独写一个脚本。

TRASH=~/trash

set -e #Exit immediately if any untested command fails in non-interactive mode.

if [[ $1 =~ ^-[^rf] ]]; then
echo "usage: rm [-rf] files"
exit 1
fi

if [ $# == 0 ]; then
echo "usage: rm [-rf] files"
exit 2
fi

mkdir -p $TRASH
echo rm $@

if [[ $1 =~ ^-[rf]|^-rf$ ]]; then
for (( i=2;i<=$#;i++ )); do
eval file="\${$i}"
echo "$file
mv "$file" $TRASH
done
else
for (( i=1;i<=$#;i++ )); do
eval file="\${$i}"
echo "$file
mv "$file" $TRASH
done
fi

上面的脚本主要针对​​rm *​​​, ​​rm -rf *​​​, ​​rm -f *​​​, ​​rm -r​​​等危险的行为。
​​​$file​​​ 之所以用​​""​​ 包围,是考虑到文件名含有空格的情况。

2. 将脚本放到​​/usr/bin/​​ 下

一般​​$PATH​​​包含着​​/usr/bin/​​​,如果没有的话可以修改​​/etc/profile​​​文件,在文件末尾添加类似​​PATH=$value:$PATH​​​的语句。之后,给脚本加上可执行权限,移动到​​/usr/bin/​​​ 下,敲​​myrm​​,系统就能找到了。

3. 修改文件​​~/.bashrc​

给文件​​~/.bashrc​​增添如下代码

alias rm=myrm

myclear(){
ls ~/trash
if [ $? -eq 0 ]; then
read -p "Do you want to clear all files in ~/trash (yes/no): " var
if [ $var = "yes" ]; then
\rm -rf ~/trash/*
elif [ $var = "no" ]; then
echo "nothing to do"
fi
fi

在这之后,可放心使用​​rm​​​,并可用myclear定期清空自己的​​~/trash​​​回收站。
———————————————————————-
注:这种方法仅在终端中敲命令有效,对于自己编写的脚本,rm还是原来的rm。