0

在我的备份脚本中,我只想保留 7 天的备份(为此尝试使用 logrotate 并且效果很好,但是我遇到了 cron.daily 的时间问题以及它如何影响“dateext”)。我在使用参数扩展从文件名中提取日期时遇到问题。

以下是一些文件的一些示例

  • foo.bar.tar.gz-20120904
  • bar.baz.tar.gz-20120904
  • ...

这是我的 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'
4

2 回答 2

3

删除 周围的引号*,以防止 globbing:

for f in ${path}*; do

{ }这里没有严格要求,但更容易阅读)

不是问题的一部分,但 Bourne shell 语法[ $fileSeconds -lt $keepSeconds ]可以写成(( $fileSeconds < $keepSeconds ))可能更安全。

于 2012-09-04T16:00:46.983 回答
1

正如cdarke*所说,删除循环中的引号for

for f in ${path}/*; do

发生的情况是执行的 shelldate获取 '/foo/*' 并将其扩展为文件名列表(多个),然后${f##*-}在列表的一部分上使用,并date使用多个名称和对象调用。

bash -x your-script.sh例如,如果您使用 运行,您会看到这一点。当一些神秘的事情发生时,第一步是确保你知道 shell 在做什么。在循环中添加echo "$f"orecho $f可以帮助您理解——尽管您会得到两个不同的答案。

于 2012-09-04T17:25:27.537 回答