在我的备份脚本中,我只想保留7天的备份(尝试使用logrotate进行此操作并且它运行良好,但我遇到了cron.daily的时间问题以及它如何影响“dateext” “)。我在使用参数扩展从文件名中提取日期时遇到了问题。
以下是一些文件的一些示例
这是我的bash脚本:
#!/bin/bash
path="/foo/"
today=$(date +%Y%m%d)
keepDays=7
keepSeconds=$(date -d "-$keepDays day" +%s)
for f in $path"*"; do
fileSeconds=$(date -d ${f##*-} +%s)
if [ $fileSeconds -lt $keepSeconds ]
then
rm $f
fi
done
这是我得到的错误:
date: extra operand `/foo/foo.bar.tar.gz-20120904'
答案 0 :(得分:3)
删除*
周围的引号,以阻止通配:
for f in ${path}*; do
(这里并不严格要求{ }
,但要便于阅读)
不是问题的一部分,但Bourne shell语法[ $fileSeconds -lt $keepSeconds ]
可以写成(( $fileSeconds < $keepSeconds ))
,这可能更安全。
答案 1 :(得分:1)
正如cdarke所述,删除*
循环中for
周围的引号:
for f in ${path}/*; do
执行date
的shell获取'/ foo / *'并将其扩展为文件名列表(多个),然后在列表的一部分上使用${f##*-}
,并且使用多个名称和对象调用date
。
例如,如果您使用bash -x your-script.sh
运行,则会看到此信息。当一些神秘的事情发生时,第一步是确保你知道shell在做什么。在循环中添加echo "$f"
或echo $f
可以帮助您理解 - 尽管您会得到两个不同的答案。