设为首页收藏本站

追梦Linux

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 916|回复: 0

避免rm -rf 引发惨案

[复制链接]

482

主题

485

帖子

16万

积分

CEO

Rank: 9Rank: 9Rank: 9

积分
169037

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2018-5-3 11:35:08 | 显示全部楼层 |阅读模式
在Linux中,rm是一个高效的工具,但是有时能带来灾难性的后果。敲一个rm -rf *就可能让今天的工作白做了,及时发现问题的话用debugfs也许能挽回损失,但是万一,万一磁盘数据被覆盖就GG了。接下来,做点事儿改变一下rm的行为。
1. 创建myrm脚本
因为exit会使得子shell退出,如果将此脚本写成一个函数放到.bashrc的话,中间一旦出错就会导致终端窗口关闭。故单独写一个脚本,并授予执行权限。
cat /usr/bin/myrm
[Bash shell] 纯文本查看 复制代码
#!/bin/bash
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 => ~/trash"
        mv "$file" $TRASH
    done
else 
    for (( i=1;i<=$#;i++ )); do
        eval file="\${$i}"
        echo "$file => ~/trash"
        mv "$file" $TRASH
    done    
fi
上面的脚本主要针对rm *, rm -rf *, rm -f *, rm -r等危险的行为。
$file 之所以用"" 包围,是考虑到文件名含有空格的情况。
2、修改文件~/.bashrc添加如下
[Bash shell] 纯文本查看 复制代码
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,如果脚本中想如此使用就使用自己写的my

小黑屋|手机版|Archiver|追梦Linux    点击这里给我发消息

GMT+8, 2021-6-20 05:07 , Processed in 0.758615 second(s), 29 queries .

Powered by 追梦Linux! X3.3 Licensed

© 2015-2017 追梦Linux!.

快速回复 返回顶部 返回列表