在bash脚本中提取文件名的结尾

时间:2012-09-04 15:55:52

标签: bash

在我的备份脚本中,我只想保留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'

2 个答案:

答案 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可以帮助您理解 - 尽管您会得到两个不同的答案。