我使用以下格式备份#01.tar.gz,备份#02.tar.gz等将备份文件保存在文件中。 但现在我需要在备份目录上循环以找到最大的数字,并将下一个文件增量命名为ex:backup#03.tar.gz 任何帮助?
答案 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
我这样写它是自我解释的,所以我确信有更高效或更紧凑的方法来做同样的事情,但这应该可以帮助你适应/插入你更宏大的方案。
所以,总结一下这些操作:
当然,您可以更改 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