shell脚本备份系统

时间:2017-02-11 20:08:40

标签: bash shell

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

2 个答案:

答案 0 :(得分:3)

这是一个不需要子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"

答案 1 :(得分:0)

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

#!/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
  • 将此整数值增加1
  • 使用 printf 格式化新的备份文件名,包括填充
  • 重要打破循环,因为我们已经知道此循环中的第一个文件是最新的备份文件,因此我们可以退出。

当然,您可以更改 filename 的获取方式。

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

编辑:在@Fred的有价值的输入之后,在坚持使用ls为我排序文件时,以下不会产生尽可能多的子shell,它使用bash自己的算法和来自-v的非常有用的printf选项:

#!/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