2014-01-29 27 views
1

我有一個目錄中的文件是基於日期但沒有明顯的日期標記。你如何通過循環某個日期範圍

File_yyyymmdd_record.log 

這些都躺在一個目錄幾年的時間價值。 現在,如果這些都是簡單的數字都是我需要做的是得到的差異,incremenet反推值

var=substring(File_yyyymmdd_record.log) /* get the yyyymmdd part */ 
var2=substring(File2_yyyymmdd_record.log) /* get the yyyymmdd part */ 
delta=var2-var1 
set i=delta and loop through to get the values for all these recordID's (record ID is the yyyymmdd part) 

的問題是,如果我在目錄中有2個不同的月份,也年前說的20131210和20140110 不同之處在於它不會在該目錄中記錄所有recordID,因爲當它溢出到下個月時,純數字計算不適用 - 它應該是基於日期的計算。 我想要做的是使用2輸入參數外殼

shell.sh recordID1 recordID2 

,並根據這些就可以找到所有記錄,並通過每個記錄一些地方和循環並將其作爲這樣

find <dir> -iname recordID* ...<some awk and sed here> | 
    while read recordID ; 
    do <stuff > 
    done 
輸入

無論如何,這可以在2個上下文中實現 - 首先是日期計算部分,另一個是存儲這些recordID,以便我可以循環訪問它們。也許回聲他們到一個tmp文件是什麼來自蝙蝠。

對於日期計算部分 - 我試過這個,它的工作原理。但不知道這是否會動搖一些時間/情況

echo $((($(date -u -d 2010-04-29 +%s) - $(date -u -d 2010-03-28 +%s))/86400)) 

因此,考慮recordID1爲20100328我有32天的recordId的尋找在該目錄中。 您必須從記錄ID1中提前32天,並將它們存儲在某個位置。 如何做到最好。

回答

1

我得到了你的觀點,你需要找出日誌文件與20131210和20140110之間的文件名。 (無需轉換爲信號出現時間)

#! /usr/bin/bash 

sep=20131210 
eep=20140110 

find /DIR -type f -name "*.log" |while read file 
do 
    d=${file:5:8} 
    if [ "$d" -ge "$sep" ] && [ "$d" -le "$eep" ]; then 
    do <stuff > 
    fi 
done 
1

像這樣的東西應該做的:

s=20130102 # start date 
e=20130202 # end date 

sep=$(date +"%s" -d"$s") # conv to epoch 
eep=$(date +"%s" -d"$e") 
for f in *.log; do 
    d=$(date +"%s" -d$(sed -n 's/^[^_]*_\([^_]*\)_[^_]*.log/\1/p' <<< "$f")) 
    if [ "$d" -ge "$sep" ] && [ "$d" -le "$eep" ]; then 
     echo $f 
    fi 
done 
+0

e.g.here是例如目錄和內容'/ testdir內容:datalog.20131030.part.001 datalog20131030.part.002 datalog20120910.part.001 datalog20120910.part.002 datalog20130930.part.001 datalog20130930.part.002'''shell.ksh 20130930 201310301' should爲20130930和201310301系列提取每個part.001和part002文件。隔離recordID - 這些和文件名稱的yyyymmdd。對於這個目錄,給我所有符合該範圍的文件和他們的記錄ID(回顯這些名字)TY – user1874594