最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

shell編程之實(shí)現(xiàn)windows回收站功能分享

 更新時(shí)間:2014年03月05日 16:22:58   作者:  
這篇文章主要介紹了使用trash命令替代linux rm命令實(shí)現(xiàn)windows回收站的功能,需要的朋友可以參考下

一. 功能簡介
1. 將刪除的文件放在回收站中
2. 恢復(fù)刪除的文件
3. 實(shí)現(xiàn)linux rm命令的功能, 使用起來幾乎和linux 系統(tǒng)自帶的rm ,命令完全一樣
4. 新增功能: rm -l, rm -e, rm -c
5. 該腳本每次在運(yùn)行時(shí)候會檢查$HOME/.trash 目錄下文件大小之和, 若
超過最大容量, 腳本會自動將日志文件中所記錄文件中的前一半文件從回
收站中清除,所以建議刪除大文件(相對于回收站最大容量而言)直接用
命令/bin/rm 而不要用 rm.

二. 使用方法:
1. 將trash文件放到 $HOME/bin/
2. 在$HOME/.bashrc 文件中加入alias rm=”$HOME/bin/trash”, 重新登陸終端或執(zhí)行bash命令。
3. 執(zhí)行命令rm -e 配置回收站的最大容量,單位K
4. 回收站的默認(rèn)目錄為:$HOME/.trash, 默認(rèn)配置文件為:$HOME/.trash/trash.conf
默認(rèn)log文件為:$HOME/.trash/trash.log
5. 怎樣恢復(fù)文件:
在linux 終端中輸入rm -l, 然后 在RowNumber: 后面鍵入要?jiǎng)h除文件所在的行標(biāo)識:988 鍵入y/Y 然后按回車鍵 恢復(fù)成功.
如果想只查看刪除列表, 則鍵入rm -l 后直接按回車鍵或者鍵入Q/q
6. 更詳細(xì)的參數(shù)介紹請鍵入:rm --help

三. 注意事項(xiàng)
 1. 想要手動清空$HOME/.trash目錄需要用/bin/rm命令, 請不要嘗試用rm -r $HOME/.trash 的方法.
 2. 該腳本不支持rm -r -f , rm -rfi (選項(xiàng)組合超過2個(gè))格式.
 3. 如果你可以你甚至可以用該腳本作為備份腳本, 假若想備份test2.txt你只需要執(zhí)行rm test2.txt, 當(dāng)然如果真想備份某個(gè)文件的話, 最好編寫專門的備份腳本。

復(fù)制代碼 代碼如下:

#!/bin/bash
#配置回收站最大的存儲空間(字節(jié))
#maxmemory=51200 (50M)
#maxmemory=102400 (100M)
#maxmemory=512000 (500M)

#根據(jù)情況設(shè)置為50M(對于isoa服務(wù)開發(fā)來說足夠了)
maxmemory=3145728

#設(shè)置回收站所在的目錄
trash=$HOME/.trash
#設(shè)置日志文件所在的目錄
mvlog=$trash/trash.log

from1=$1
from2=$2

var_pwd=
var_father=

#回收站若不存在,則新建之
if [ ! -e $trash ];then
 mkdir -p $trash
 chmod 755 $trash
fi

#產(chǎn)生7位的隨機(jī)數(shù)
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)

#文件不存在時(shí)的提示信息
function file_null()
{
 local file=$1
 echo "rm: cannot remove '$file': No such file or directory"
}

#打印參數(shù)出錯(cuò)后的提示信息
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.
"
}

#回收站管理函數(shù)
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=
#目錄處理函數(shù)
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 
}

#命令不帶參數(shù)時(shí)的普通文件刪除函數(shù)
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
}

#腳本開始

#檢測回收站已用存儲空間,如果已經(jīng)達(dá)到最大值,則刪除日志文件中位于前面的一半的文件
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

相關(guān)文章

  • 詳解shell數(shù)組${arr[*]}和${arr[@]}區(qū)別

    詳解shell數(shù)組${arr[*]}和${arr[@]}區(qū)別

    本文主要介紹了詳解shell數(shù)組${arr[*]}和${arr[@]}區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Linux命令之tail的使用及應(yīng)用場景介紹

    Linux命令之tail的使用及應(yīng)用場景介紹

    tail 是一條在 Linux 系統(tǒng)中常用的命令行工具,用來顯示文件的末尾內(nèi)容,tail 的功能強(qiáng)大且簡潔,能夠滿足多種應(yīng)用需求本文就給大家介紹一下Linux命令tail的使用及應(yīng)用場景,需要的朋友可以參考下
    2023-09-09
  • Linux文件處理常用命令操作技巧

    Linux文件處理常用命令操作技巧

    我是Linux初學(xué)者,在這里小編給大家分享linux幾個(gè)常用文件處理命令,感興趣的朋友參考下吧
    2017-08-08
  • awk區(qū)間取值的例子

    awk區(qū)間取值的例子

    awk區(qū)間取值的例子,匹配某一區(qū)間內(nèi)的值,有需要的朋友不妨參考下
    2013-02-02
  • Linux常用命令與命令縮寫整理

    Linux常用命令與命令縮寫整理

    這篇文章介紹了Linux的常用命令與命令縮寫,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 一些你必須要熟練掌握的git命令

    一些你必須要熟練掌握的git命令

    git 現(xiàn)在的火爆程度非同一般,它被廣泛地用在大型開源項(xiàng)目,團(tuán)隊(duì)開發(fā),以及獨(dú)立開發(fā)者,甚至學(xué)生之中。下面這篇文章主要給大家分享了一些你必須要熟練掌握的git命令,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • Shell腳本實(shí)現(xiàn)上傳zip壓縮文件到FTP服務(wù)器

    Shell腳本實(shí)現(xiàn)上傳zip壓縮文件到FTP服務(wù)器

    這篇文章主要介紹了Shell腳本實(shí)現(xiàn)上傳zip壓縮文件到FTP服務(wù)器,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-12-12
  • 一波實(shí)用的Bash Shell整理

    一波實(shí)用的Bash Shell整理

    這篇文章主要介紹了一波實(shí)用的Bash Shell整理,適用于Ubuntu等Debian系的Linux系統(tǒng),需要的朋友可以參考下
    2015-06-06
  • Linux命令行查看cpu(lm_sensors)和顯卡溫度(nvidia-smi)的操作方法

    Linux命令行查看cpu(lm_sensors)和顯卡溫度(nvidia-smi)的操作方法

    lm_sensors,是一款基于linux系統(tǒng)的硬件監(jiān)控的軟件??梢员O(jiān)控主板,CPU的工作電壓,溫度等數(shù)據(jù),這篇文章主要介紹了Linux命令行如何查看cpu(lm_sensors)和顯卡溫度(nvidia-smi),需要的朋友可以參考下
    2022-12-12
  • Linux中執(zhí)行shell腳本的4種方法總結(jié)

    Linux中執(zhí)行shell腳本的4種方法總結(jié)

    這篇文章主要介紹了Linux中執(zhí)行shell腳本的4種方法總結(jié),即在Linux中運(yùn)行shell腳本的4種方法,需要的朋友可以參考下
    2014-08-08

最新評論

贵定县| 泾川县| 广昌县| 北流市| 阿荣旗| 大田县| 林芝县| 洪湖市| 库伦旗| 万荣县| 宁国市| 镇江市| 遂川县| 逊克县| 璧山县| 嘉善县| 辽宁省| 莎车县| 邹平县| 长泰县| 台安县| 交口县| 华宁县| 周口市| 兴海县| 巴林右旗| 沙坪坝区| 海伦市| 临沂市| 卢氏县| 黄陵县| 中宁县| 高雄县| 保康县| 溆浦县| 大埔县| 阆中市| 黎川县| 三台县| 东乡| 当阳市|