2014-03-19 87 views
3

我的日誌文件,其名稱列表中有日期後綴:查找文件

mylog.2014-01-01.gz 
mylog.2014-01-02.gz 
........ 
mylog.2014-03-04.gz 

我有開始和結束日期,例如2014年2月1日 - > 2014年2月4日。在Linux腳本上使用bash我想查找名稱匹配日期範圍的文件。所以,我想獲得的文件:

mylog.2014-02-01 
mylog.2014-02-02 
mylog.2014-02-03 
mylog.2014-02-04 

我不能依賴於

find /path -type f -newer $startFile -not -newer $endFile mylog*gz 

因爲mylog.2014-02-01可以2014年2月1日23時59修改2014年2月2日00:01

+0

您可能無法在Bash中使用'find'命令這樣簡單的操作,而且Bash在日期處理上不太好。你最好用Python或Perl來做到這一點。你想要一個Perl解決方案嗎? –

回答

1

可能:

START_DATE=$(date -d '2014-02-01 01' '+%s') 
END_DATE=$(date -d '2014-02-04 01' '+%s') 
IFS=. 
for i in mylog.*.gz; do 
    fname=($i) 
    d=$(date -d "${fname[1]} 01" '+%s') 
    if (($d > $START_DATE && $d < $END_DATE)); then 
     echo "Found file: $i" 
    fi 
done 

感謝@kojiro爲IFS和glob的想法。

+1

我認爲這裏有一些錯別字。很確定'我'不是一個命令。而且,如果該命令替換不能保證特定類型的空白處理,則遍歷命令替換的輸出是危險的。 'find'不。你應該使用globs代替。 (所有這些,算法上這似乎是一個明智的做法。) – kojiro

+1

'IFS =。因爲我在mylog。*。gz;做f =($ i); d = $(date -d「$ {f [1]} 01」'+%s'); ...'? - 消除一堆子殼,危險的詞語和相對昂貴的操作。 – kojiro

+0

我已經創建了函數getLogs(),其中第一個參數是目錄。我可以將運行命令的結果兩次賦給一行變量:result = $(getLogs/dir1 2014-01-12 2014-01-22)$(getLogs/dir2 2014-01-12 2014-01-22) – KrzyH