2012-09-04 57 views
0

在我的備份腳本中,我只想保留7天的備份(嘗試使用logrotate進行此操作,並且工作完美,但遇到了cron.daily時間問題以及它如何影響「日期」)。我遇到了使用參數擴展從文件名中提取日期的問題。在bash腳本中提取文件名的結尾

下面是一些文件的一些例子

  • 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 

這裏是ER ROR我越來越:

date: extra operand `/foo/foo.bar.tar.gz-20120904' 

回答

1

由於cdarke說,除去*各地報價在for循環:

for f in ${path}/*; do 

什麼情況是,執行date殼變得「/富/ *」,並擴大了成文件名的列表(多於一個),然後在列表的一部分上使用${f##*-},使用多個名稱和對象調用date

例如,如果您使用bash -x your-script.sh運行,您會看到此內容。當一些神祕的事情發生時,第一步就是確保你知道shell在做什麼。在循環中添加echo "$f"echo $f將幫助您理解 - 儘管您會得到兩個不同的答案。

3

取出*各地的報價,即防止通配符:

for f in ${path}*; do 

(該{ }並不嚴格要求在這裏,但更容易閱讀)

不是問題的一部分,但Bourne shell語法[ $fileSeconds -lt $keepSeconds ]可寫爲(($fileSeconds < $keepSeconds)),這可能更安全。