linux自建回收站

 

1.vim ~/.bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

mkdir -p ~/.trash #从这里是需要添加的内容
alias rm=trash
alias r=trash
alias rl='ls ~/.trash/'
alias ur=undelfile

undelfile()
{
    mv -i ~/.trash/$@ ./
}

trash()
{
    mv -i $@ ~/.trash/
}

cleartrash()
{
    read -p "clear sure?[n]" confirm
    [ $confirm == 'y' ] || [ $confirm == 'Y' ] && /bin/rm -rf ~/.trash/*
}

 

 

source ~/.bashrc #加载生效

2.删除文件

[root@node62 ~]# rm a.txt bak

3.查看回收站

[root@node62 ~]# rl
a.txt  bak

4.还原被删除的文件

[root@node62 ~]# ur a.txt
[root@node62 ~]# rl
bak

5.清空回收站

[root@node62 ~]# cleartrash
clear sure?[n]y

 自定义回收站命令

mkdir -p ~/.trash #从这里是需要添加的内容
alias rm=trash
alias r=trash
alias rl='ls ~/.trash/'
alias hy=undelfile
alias qingkong=cleartrash
undelfile()
{
    mv -i ~/.trash/$@ ./
}

trash()
{
    mv -i $@ ~/.trash/
}

cleartrash()
{
    read -p "clear sure?[n]" confirm
    [ $confirm == 'y' ] || [ $confirm == 'Y' ] && /bin/rm -rf ~/.trash/*
}

 

 优化写法2 删除的文件后面加入日期标识

mkdir -p ~/.trash #从这里是需要添加的内容
alias rm=trash
alias r=trash
alias rl='ls ~/.trash/'
alias hy=undelfile
alias qingkong=cleartrash
undelfile()
{
    mv -i ~/.trash/$@ ./
}

trash()
{
        del_date=`date +%Y%m%d%H%M%S`
    # 循环是因为可能rm多个文件
    for arg in "$@"
    do
       # 这里将删除时间加入到文件名后是因为mv命令不能覆盖非空目录以及不能使用文件覆盖文件夹
       # 加上时间就不会有同名的文件了
       mv $arg ~/.trash/$arg-${del_date}
    done
}

cleartrash()
{
    read -p "clear sure?[n]" confirm
    [ $confirm == 'y' ] || [ $confirm == 'Y' ] && /bin/rm -rf ~/.trash/*
}

 

完善回收站

https://github.com/LaiJingli/rmtrash

注意rm_restore函数里日志截取参数应该是第6个 不然恢复的时候成 from 多了会重复覆盖

此行修改为第6个参数

originalpath=`cat $trash_log|grep /$file$|awk '{print $5}'`
originalpath=`cat $trash_log|grep /$file$|awk '{print $6}'`

 

rm -h

用法1:rmtrash.sh file1[file2][dir3][…]删除文件或dir,然后将它们移动到rmtrash回收站

用法2:rm file1[file2][dir3][…]删除文件或dir,然后将它们移动到rmtrash回收站

rm是rmtrash.sh的别名。

选项:

-f mv一个或多个文件到rmtrash回收站

-r mv一个或多个文件到rmtrash回收站

-fr mv一个或多个文件到rmtrash回收站

-rf 射频mv一个或多个文件到rmtrash回收站

-R 将所选文件从rmtrash回收站还原到原始路径

-l 列出垃圾回收站的内容

-i 我显示已删除文件历史的详细日志

-d 按用户输入的文件名从垃圾桶中删除一个或多个文件

-e 清空垃圾回收站

-h 显示此帮助菜单
3)如果需要彻底删除文件
a、# rm -e 清空回收站
b、# /bin/rm file 直接删除文件而不经过回收站

 思考后面下发现如果同一秒内删除同名文件,回收站内会文件重名 加上md5校验文件就不会重复了

代码优化部分

rm_mv () {
        echo ----------------------------
        now=`date +%Y%m%d_%H:%M:%S`
        dupfix=.`date +%Y%m%d%H%M%S`
        ###将用户输入的文件循环mv到trash中
        ###for file in $file_list ;do
                #echo $file
                ###提取用户输入参数的文件名、目录名,拼出绝对路径
                file_name=`basename $file`
                file_dir=$(cd `dirname $file`;pwd)
                file_fullpath=$file_dir/$file_name
### 获取文件MD5 file_md5
=.`md5sum $file_fullpath | awk ' { print $1 } '` ###判断要删除的文件或者目录大小是否超过2G #echo file_fullpath: $file_fullpath #if [[ "$file_fullpath" == "/*" ]];then # echo action deny! #else ####判断即将删除的文件在trash目录里是否已存在 if [[ `ls $trash_dir|grep ^${file_name}$` ]];then ##已存在,文件名重复,需要rename,想原始名的基础上加后缀 加入md5去重 显示文件也去重 trash_dest_path=$trash_dir$file_name$dupfix$file_md5 echo trash目录里已存在$file_name,需要rename $file_name$dupfix$file_md5 else ##不重名,直接按原始文件名保存 trash_dest_path=$trash_dir$file_name fi ####判断如果是要删除文件是根目录,则直接提示并拒绝 if [[ "$file_name" == "/" ]];then echo rm拒绝执行删除根目录操作,否则系统就挂了,你就悲剧了,请检查... else ###mv成功记录log,记录删除时的文件、目录的路径等信息到log,以便恢复数据 mv $file_fullpath $trash_dest_path && \ echo $now `date +%s` `whoami` moved from $file_fullpath to $trash_dest_path >> $trash_log && \ echo -e "\033[31m\033[05m $file is deleted from $file_fullpath\033[0m" #cat $trash_log fi #fi ###done }

 

 

 

 

参考链接:https://mp.weixin.qq.com/s?__biz=MzA4NzQzMzU4Mg==&mid=2652923726&idx=1&sn=6984ef64704cef3b67d4b6acf44dc888&chksm=8bed4f4fbc9ac6590e9a419545bdc303b0380b2206e1a663e5489e8c549f2da7b3b69d781edf&mpshare=1&scene=23&srcid=0220SnBWZWLj2jh1CIUrD09y#rd

posted @ 2019-02-21 17:10  夜辰雪扬  阅读(446)  评论(0)    收藏  举报