源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

shell编程之实现windows回收站功能分享

  • 时间:2021-04-19 18:44 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:shell编程之实现windows回收站功能分享
一. 功能简介 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, 当然如果真想备份某个文件的话, 最好编写专门的备份脚本。
[u]复制代码[/u] 代码如下:
#!/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
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部