shell 处理被删除文件的归档

本文介绍了一款基于Shell脚本实现的文件备份与恢复工具,该工具能够帮助用户管理和恢复已删除的文件。通过简单的命令行操作,用户可以查看、选择并恢复所需的文件版本,同时还可以选择是否保留已恢复的文件备份。
摘要由CSDN通过智能技术生成
#!/bin/bash
# 前期定义的删除文件的保存目录
archivedir="$HOME/delete-files"
# 删除命令
realrm="$(which rm)"
# 移动命令
move="$(which mv)"

# 当前所在目录 
dest=$(pwd)

# 定义的删除文件的保存目录是否存在,如果不存目录,就异常退出,并提示
if [ ! -d $archivedir ] ; then
   echo "$0: 没有删除文件或者目录 (通过日期排序):"
   exit 1
fi
 # 移动删除文件的目录里
 cd $archivedir 
 如果没有参数,输出对应的所有删除文件,并退出
 if [ $# -eq 0 ] ; then
  echo "$0: 输出删除文件或者目录 (通过日期排序):"
  #-FC 列出项目 按文件类型归类 目录后面加/ 可执行文件加* 连接文件加@ 
  # 这里正则表达 将文件前面的日期删除
  ls -FC | sed -e 's/\([[:digit:]][[:digit:]]\.\)\{5\}//g' \
      -e 's/^/ /'
   exit 0
fi
# 匹配文件 2> /dev/null 用于丢弃报错误  wc -l 统计个数
 matches="$(ls -d *"$1" 2> /dev/null | wc -l)"
 # 没有匹配的
if [ $matches -eq 0 ] ; then
  echo "没有匹配 \"$1\" 在删除的目录中" >&2
  exit 1
fi
# 如果匹配的大于1
if [ $matches -gt 1 ] ; then
 echo "有很多的文件和目录在删除文件中"
 index=1
 # 遍历输出信息 和删除时间
 for name in $(ls -td *$1)
 do
  datetime="$(echo $name | cut -c1-14 | awk -F. '{ print $5"/"$4" at "$3":"$2":"$1 }')"
  filename="$(echo $name | cut -c16-)"
  if [ -d $name ] ; then
   filecount="$(ls $name | wc -l | sed 's/[^[:digit:]]//g')"
   echo " $index) $filename (countents = ${filecount} items," \
    "  deleted = $datetime)"
   else
    size="$(ls -sdk1 $name | awk '{print $1}')"
    echo " $index) $filename (size = ${size}kb,deleted = $datetime)"
   fi
   index=$(( $index + 1 ))
  done
  echo ""
  echo -n "你想要恢复哪一个版本 $1 呢(0 退出)? [1]:"
  # 读取用户需要恢复的版本
  read desired
  # 验证输入的必须只能有数字
  if [ ! -z "$(echo $desired | sed 's/[[:digit:]]//g')" ] ; then
   echo "$0 无效的输出恢复被取消" >&2
   exit 1
  fi
  # 如果大于版本时候
  if [ ${desired:=1} -ge $index ] ; then
   echo "$0 版本恢复被取消,输入的值太大。" >&2
   exit 1
  fi
   # 输入小于1 退出
  if [ $desired -lt 1 ] ; then
   echo "$0 版本恢复被取消" >&2
   exit 1
  fi
   # 读取匹配的
  restore="$(ls -td1 *"$1" | sed -n "${desired}p")"
  # 如果对应的目录存在此文件
  if [ -e "$dest/$1" ] ; then
   echo "\"$1\" 已经存在,无法恢复。" >&2
   exit 1
  fi
  # 文件复原
  echo -n "文件复原 \"$1\" ..."
  $move "$restore" "$dest/$1"
  echo "恢复完成."
  # 是否删除对应的文件
  echo -n "是否删除这个版本的文件?[y] "
  read answer

  if [ ${answer:=y} = "y" ] ; then
   $realrm -rf *"$1"
   echo "已经删除了"
  else
   echo "此版本文件被保存"
  fi
  # 匹配的只有一项时候
 else
  if [ -e "$dest/$1" ] ;then
   echo "\"$1\" 已经存在,无法恢复。" >&2
   exit 1
  fi
  
  restore="$(ls -d *"$1")"
  
  echo -n "文件复原 \"$1\" ..."
  $move "$restore" "$dest/$1"
  echo "恢复完成."
 fi
 
exit 0
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的天才女友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值