shell编程之实现windows回收站功能分享
2014-03-05 00:00
615 查看
一. 功能简介
1. 将删除的文件放在回收站中
2. 恢复删除的文件
3. 实现linux rm命令的功能, 使用起来几乎和linux 系统自带的rm ,命令完全一样
4. 新增功能: rm -l, rm -e, rm -c
5. 该脚本每次在运行时候会检查$HOME/.trash 目录下文件大小之和, 若
超过最大容量, 脚本会自动将日志文件中所记录文件中的前一半文件从回
收站中清除,所以建议删除大文件(相对于回收站最大容量而言)直接用
命令/bin/rm 而不要用 rm.
二. 使用方法:
1. 将trash文件放到 $HOME/bin/
2. 在$HOME/.bashrc 文件中加入alias rm=”$HOME/bin/trash”, 重新登陆终端或执行bash命令。
3. 执行命令rm -e 配置回收站的最大容量,单位K
4. 回收站的默认目录为:$HOME/.trash, 默认配置文件为:$HOME/.trash/trash.conf
默认log文件为:$HOME/.trash/trash.log
5. 怎样恢复文件:
在linux 终端中输入rm -l, 然后 在RowNumber: 后面键入要删除文件所在的行标识:988 键入y/Y 然后按回车键 恢复成功.
如果想只查看删除列表, 则键入rm -l 后直接按回车键或者键入Q/q
6. 更详细的参数介绍请键入:rm --help
三. 注意事项
1. 想要手动清空$HOME/.trash目录需要用/bin/rm命令, 请不要尝试用rm -r $HOME/.trash 的方法.
2. 该脚本不支持rm -r -f , rm -rfi (选项组合超过2个)格式.
3. 如果你可以你甚至可以用该脚本作为备份脚本, 假若想备份test2.txt你只需要执行rm test2.txt, 当然如果真想备份某个文件的话, 最好编写专门的备份脚本。
1. 将删除的文件放在回收站中
2. 恢复删除的文件
3. 实现linux rm命令的功能, 使用起来几乎和linux 系统自带的rm ,命令完全一样
4. 新增功能: rm -l, rm -e, rm -c
5. 该脚本每次在运行时候会检查$HOME/.trash 目录下文件大小之和, 若
超过最大容量, 脚本会自动将日志文件中所记录文件中的前一半文件从回
收站中清除,所以建议删除大文件(相对于回收站最大容量而言)直接用
命令/bin/rm 而不要用 rm.
二. 使用方法:
1. 将trash文件放到 $HOME/bin/
2. 在$HOME/.bashrc 文件中加入alias rm=”$HOME/bin/trash”, 重新登陆终端或执行bash命令。
3. 执行命令rm -e 配置回收站的最大容量,单位K
4. 回收站的默认目录为:$HOME/.trash, 默认配置文件为:$HOME/.trash/trash.conf
默认log文件为:$HOME/.trash/trash.log
5. 怎样恢复文件:
在linux 终端中输入rm -l, 然后 在RowNumber: 后面键入要删除文件所在的行标识:988 键入y/Y 然后按回车键 恢复成功.
如果想只查看删除列表, 则键入rm -l 后直接按回车键或者键入Q/q
6. 更详细的参数介绍请键入:rm --help
三. 注意事项
1. 想要手动清空$HOME/.trash目录需要用/bin/rm命令, 请不要尝试用rm -r $HOME/.trash 的方法.
2. 该脚本不支持rm -r -f , rm -rfi (选项组合超过2个)格式.
3. 如果你可以你甚至可以用该脚本作为备份脚本, 假若想备份test2.txt你只需要执行rm test2.txt, 当然如果真想备份某个文件的话, 最好编写专门的备份脚本。
#!/bin/bash #配置回收站最大的存储空间(字节) #maxmemory=51200 (50M) #maxmemory=102400 (100M) #maxmemory=512000 (500M) #根据情况设置为50M(对于isoa服务开发来说足够了) maxmemory=3145728 #设置回收站所在的目录 trash=$HOME/.trash #设置日志文件所在的目录 mvlog=$trash/trash.log from1=$1 from2=$2 var_pwd= var_father= #回收站若不存在,则新建之 if [ ! -e $trash ];then mkdir -p $trash chmod 755 $trash fi #产生7位的随机数 function rand() { a=(0 1 2 3 4 5 6 7 8 9 a b c d e A B C D E F) for ((i=0;i<7;i++)) do echo -n ${a[$RANDOM%${#a[*]}]} done } random=$(rand) #文件不存在时的提示信息 function file_null() { local file=$1 echo "rm: cannot remove '$file': No such file or directory" } #打印参数出错后的提示信息 function echo_msg() { echo -n "rm: missing operand Try 'rm --help' for more information. " } function echo_msg2() { echo -n "rm: invalid option '$1' Try 'rm --help' for more information. " } #回收站管理函数 function deal() { local tmp=$(mktemp /tmp/tfile.XXXXXX) local num=$(($(cat $mvlog| wc -l)/2)) #awk -F: -v nu=$num -v trash=$trash '{if (NR<=nu) system("rm -rf "trash"'/'"$2"':'"$3""); \ #else print $0}' $mvlog | sort -o $mvlog awk -F: -v nu=$num -v trash=$trash '{if (NR<=nu) system("rm -rf "trash"'/'"$2"':'"$3""); \ else print $0}' $mvlog >> $tmp mv $tmp $mvlog } JUG= #目录处理函数 function jug_cur() { local tmp= local dirname=$1 local jug=${dirname/\/*/} if [ "$jug" == "." ];then var_pwd=${dirname/./$(pwd)} JUG=0 elif [ "$jug" == ".." ];then tm=$(pwd) tmp=${tm%/*} var_father=${dirname/../$tmp} JUG=1 #elif [ "$jug" == "~" ];then #return 2 else JUG=2 fi } #命令不带参数时的普通文件删除函数 function rm1 { local filename=$(basename $from1) local dirname=$(dirname $from1) jug_cur $dirname if [ "$JUG" -eq 0 ];then dirname=$var_pwd elif [ $JUG -eq 1 ];then dirname=$var_father fi if [ -d "$from1" ];then echo "rm: cannot remove '$from1': Is a directory" else if [ ! -e $from1 ];then file_null $from1 else echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog mv "$from1" "$trash/$filename:$random" fi fi } #rm -i function rmi() { local filename=$(basename $from2) local dirname=$(dirname $from2) jug_cur $dirname if [ $JUG -eq 0 ];then dirname=$var_pwd elif [ $JUG -eq 1 ];then dirname=$var_father fi if [ -f "$from2" ];then echo -n "rm: remove regular file '$from2'?" read answer if [ "$answer" = 'y' -o "$answer" = 'Y' ];then echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog mv "$from2" "$trash/$filename:$random" fi else if [ ! -e $from2 ];then file_null $from2 else echo "rm: cannot remove '$from2': Is a directory" fi fi } #rm -f function rmf() { local filename=$(basename $from2) local dirname=$(dirname $from2) jug_cur $dirname if [ $JUG -eq 0 ];then dirname=$var_pwd elif [ $JUG -eq 1 ];then dirname=$var_father fi if [ -f "$from2" ];then echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog mv "$from2" "$trash/$filename:$random" else if [ ! -e $from2 ];then : else echo "rm: cannot remove '$from2': Is a directory" fi fi } #rm -r function rmr() { local filename=$(basename $from2) local dirname=$(dirname $from2) jug_cur $dirname if [ $JUG -eq 0 ];then dirname=$var_pwd elif [ $JUG -eq 1 ];then dirname=$var_father fi if [ "$from2" = "." -o "$from2" = ".." ];then echo "rm: cannot remove directory: '$from2'" elif [ -e "$from2" ];then echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog mv "$from2" "$trash/$filename:$random" else file_null $from2 fi } #rm -rf function rmrf() { local filename=$(basename $from2) local dirname=$(dirname $from2) jug_cur $dirname if [ $JUG -eq 0 ];then dirname=$var_pwd elif [ $JUG -eq 1 ];then dirname=$var_father fi if [ "$from2" = "." -o "$from2" = ".." ];then echo "rm: cannot remove directory: '$from2'" elif [ -e "$from2" ];then echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog mv "$from2" "$trash/$filename:$random" else : fi } #rm -ir function rmir() { local filename=$(basename $from2) local dirname=$(dirname $from2) jug_cur $dirname if [ $JUG -eq 0 ];then dirname=$var_pwd elif [ $JUG -eq 1 ];then dirname=$var_father fi if [ -e "$from2" ];then if [ -d "$from2" ];then echo -n "rm: remove directory '$from2'?" else echo -n "rm: remove regular file '$from2'?" fi read answer if [ "$answer" = 'y' -o "$answer" = 'Y' ];then echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog mv "$from2" "$trash/$filename:$random" fi else if [ ! -e $from2 ];then file_null $from2 fi fi } #清空回收站 function rmc() { /bin/rm -rf $trash } function rml() { local tmp=$(mktemp /tmp/tfile.XXXXXX) clear if [ ! -d "$trash" ];then mkdir $trash fi if [ ! -f "$mvlog" ];then touch $mvlog fi line=$(cat -n $mvlog | awk -F: '{print $1, "FileName:"$2, "Time: "$4":"$5":"$6}') linecount=$(cat $mvlog | wc -l) echo -e "$line" echo echo echo "[$linecount] Please enter the file you want to restore (replaced with the line number)" printf "RowNumber: " read answer if [ "$answer" = 'q' -o "$answer" = 'Q' -o "$answer" = "" ];then : else printf "Please confirm (Y/N): " read answer1 if [ "$answer1" = 'y' -o "$answer1" = 'Y' ];then address=$(sed -n "$answer""p" $mvlog | awk -F: '{print $1}') filename=$(sed -n "$answer""p" $mvlog | awk -F: '{print $2}') filerand=$(sed -n "$answer""p" $mvlog | awk -F: '{print $3}') fullname=$address/$filename if [ -e "$fullname" ];then echo "The file exist!" sleep 0.5 else old="$trash/$filename:$filerand" new="$address/$filename" mv "$old" "$new" #deline=$(cat $mvlog|sed "$answer""d" | sort -o $mvlog) deline=$(cat $mvlog|sed "$answer""d" >> $tmp) mv $tmp $mvlog echo "restore success!" sleep 0.5 fi fi fi } function help() { cat << 'EOF' Usage: rm [OPTION]... FILE... Remove (unlink) the FILE(s). -f, --force ignore nonexistent files, never prompt -i, --interactive prompt before any removal --no-preserve-root do not treat `/' specially (the default) --preserve-root fail to operate recursively on `/' -r, -R, --recursive remove directories and their contents recursively --help display this help and exit By default, rm does not remove directories. Use the --recursive (-r or -R) option to remove each listed directory, too, along with all of its contents. To remove a file whose name starts with a `-', for example `-foo', use one of these commands: rm -- -foo rm ./-foo Note that if you use rm to remove a file, it is usually possible to recover the contents of that file. If you want more assurance that the contents are truly unrecoverable, consider using shred. Report bugs to <bug-coreutils@gnu.org>. EOF } #脚本开始 #检测回收站已用存储空间,如果已经达到最大值,则删除日志文件中位于前面的一半的文件 mem=$(du -s $trash|awk '{print $1}') if [ "$mem" -gt $maxmemory ];then deal fi if [ "$#" -eq 0 ];then echo_msg fi if [ "$#" -eq 1 ];then case "$from1" in -i) echo_msg -f) echo_msg -r | -R) echo_msg -ir|-ri|-iR|-Ri|-if|-fi|-rf|-fr|-Rf|-fR) echo_msg -l) rml -c) rmc --help) help -*) echo_msg2 $from1 *) rm1 esac fi if [ "$#" -ge 2 ];then until [ "$2" = "" ] do from2=$2 case "$from1" in -i) rmi -f) rmf -r|-R) rmr -l) rml -rf|-Rf|-fr|-fR) rmrf -ir|-ri|-iR|-Ri) rmir -if|-fi) rmf --help) help exit 1 -*) echo_msg2 $from1 exit 1 *) { until [ "$1" = "" ] do from1=$1 rm1 shift done } esac shift done fi exit
相关文章推荐
- shell编程之实现windows回收站功能分享
- 在LINUX上实现 windows 回收站功能的脚本
- android一键分享功能部分实现
- Android使用WebView实现截图分享功能
- LINE分享android利用系统自带分享实现LINE分享功能
- C# 实现模拟登录功能,实现公共类分享。
- IOS项目集成ShareSDK实现第三方登录、分享、关注等功能。
- Android中实现一个简单的分享功能
- 分享功能的实现方式
- jquery实现文本框数量加减功能的例子分享
- 了解Android微信里的WebView是如何实现分享的功能
- Python实现的远程登录windows系统功能示例
- Android实现截图和分享功能的代码
- Android中“分享”功能的实现
- Windows 2008 Server R2上实现NTP服务器功能
- jquery实现邮箱自动补全功能示例分享
- 使用UniWeibo实现Unity3d里分享到新浪微博功能
- Android实现微信的分享与发送到朋友圈功能
- windows下实现mysql的双机热备功能
- 通过Keepalived实现Redis Failover自动故障切换功能[实践分享]