shell脚本备份系统



我使用以下格式备份#01.tar.gz、备份#02.tar.gz等将备份文件保存在一个文件中。。但现在我需要在备份目录上循环,找到最大的数字,并将下一个文件增量命名为:backup#03.tar.gz有什么帮助吗?

这里有一个解决方案,它不需要子shell或外部程序,不解析ls输出(这是不推荐的),并且应该使用包含空格的文件名(甚至换行)。您可以自定义前缀和扩展名。

#!/bin/bash
dir="/path/to/files"
prefix="backup#"
ext=".tar.gz"
max=1
for file in "$dir/$prefix"*
do
[[ $file =~ /$prefix([0-9]+)$ext$ ]] || continue
n="${BASH_REMATCH[1]}"
[[ $max -gt $n ]] || max=$((n+1))
done
printf -v newfilename "$prefix%04d$ext" "$max"

有几种方法可以做到这一点,当然,我只是假设您的脚本将以某种方式从这些备份所在的目录中运行,否则只需调整即可。

#!/bin/bash
for filename in `ls backup*tar.gz -r -1`; do
echo "Last backup file found is $filename"
last=`expr ${filename[@]:7:2}`
next=`expr $last +  1`
newname=`printf "backup#%02d.tar.gz" $next`
echo "Next backup file should be $newname"
break # important!!!
done

我写这本书是为了让它不言自明,所以我相信还有更有效或更紧凑的方法可以做到这一点,但这应该有助于你调整/插入你更宏伟的计划中。

因此,总结一下操作:

  • 按相反顺序列出文件夹中与"backup*tar.gz"匹配的所有文件
  • filename指定一个此类文件的名称。第一个将是我们现有的最新备份
  • 组合使用expr数组操作提取数字并转换为整数,该整数表示最后一个备份数字
  • 使用expr将该整数值增加一
  • 使用printf格式化新的备份文件名,包括填充
  • 重要打破循环,因为我们已经知道这个循环中的第一个文件是最新的备份文件,所以我们可以退出

当然,您可以更改文件名的获取方式。

有关数组操作的参考,可以方便地将其应用于bash中的字符串,请检查http://tldp.org/LDP/abs/html/arrays.html

编辑:在@Fred的宝贵输入之后,虽然坚持使用ls为我排序文件,但以下内容没有产生那么多子shell,它使用了bash自己的算法和printf:中非常有用的-v选项

#!/bin/bash
for filename in `ls backup*tar.gz -r -1`; do
echo "Last backup file found is $filename"
last="${filename[@]:7:2}"
printf -v newname "backup#%02d.tar.gz" $((last+1))
echo "Next backup file should be $newname"
break # important!!!
done

最新更新