想必不少人体会过在Linux下误删文件的欲哭无泪的感觉。我整理出一份比较安全的rm脚本,贴在这里。


老鸟(老男孩)谈生产场景删除文件及目录经验要领:

1、用mv替代rm,不着急删,而是移动到回收站/tmp。

2、删除前务必备份,最好异机备份。

3、如果非要删除用find替代rm,包括定时任务等动作清理。

4、如果非要rm删除,请先切换目录在删,能不用通配符就不用通配符 


特性


  • 接管原生的/bin/rm命令,将待删除的文件mv至回收站,便于统一管理,或者更重要的,拯救误删文件。

  • 需要调用原生的rm时,指定路径即可,例如:/bin/rm -rfsomefolder

  • 记录删除日志到/var/log/trash.log。如果不需要记录日志,只需要将log变量置空即可。

  • 将文件移动至回收站时自动重命名,以便可以重复删除重名文件。

  • 贴图:

wKioL1XignXQXkEmAAG_g_7Hmfo404.jpg


代码

用法

  • 将下面的代码贴至~/.bashrc 或 ~/.bash_profile中,然后刷新该文件source ~/.bashrc即可。

  • 临时取消自定义的rm:可以使用前文所说的/bin/rm或在当前环境下取消该function的定义:unset -f rm。

  • 需要根据自己的系统,修改一下各个变量的定义。


logger () 
{ 
    time=`TZ="Asia/Shanghai"  date +"%Y-%m-%d %T"`;
    echo "[$time] $*"
}

rm () 
{ 
    local limit=50;
    if [ -d $HOME/.local/share/Trash/files ]; then
        trash="$HOME/.local/share/Trash/files";
    else
        trash="$HOME/.Trash";
    fi;
    local log="/var/log/trash.log";
    while [[ ! -z "$1" ]]; do
        if [[ ! -d "$1" ]]; then
            if [[ ! -f "$1" ]]; then
                shift;
                continue;
            fi;
        fi;
        full=`readlink -f "$1"`;
        base=`basename "$full"`;
        if [[ -n ` echo "$base" |grep "\." ` ]]; then
            new=`echo "$base" |sed -e "s/\([^.]*$\)/$RANDOM.\1/" `;
        else
            new="$base.$RANDOM";
        fi;
        trash_file="$trash/$new";
        local fs=`du -BM -s "$full" |awk -FM '{print $1}'`;
        if [ "$fs" -gt "$limit" ]; then
            read -p "File/Folder is ${fs}Mb, too large. rm it permanently? [Y/n]" answer;
            case "$answer" in 
                "Y" | "" | "y")
                    /bin/rm -rv "$full";
                    logger "'$full' removed permanently"
                ;;
                *)
                    logger "aborted from deleting $full"
                ;;
            esac;
            shift;
            continue;
        fi;
        mv "$full" "$trash_file";
        if [ $? -eq 0 ]; then
            if [ -w "$log" ]; then
                logger "$full => [$trash_file]" | tee -a "$log";
            else
                logger "$full => [$trash_file]";
            fi;
        else
            logger "Error deleting $full";
        fi;
        shift;
    done
}


ps:

如何恢复 Linux 分区下误删的文件?

http://johnnyr.blog.51cto.com/7130220/1689771