2014-01-29 3 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 разница не будет указывать на все идентификаторы записи в этом каталоге, так как, когда она перетекает на следующий месяц, простое числовое вычисление не применяется - это должен быть расчет на основе даты. , что я хочу сделать, это использовать 2 входных параметров оболочки

shell.sh recordID1 recordID2 

и на их основе будет найти все записи и хранить их какое-то место и цикл по каждой записи в качестве входного сигнала, как этот

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

В любом случае это может быть достигнуто esp в двух контекстах: Сначала часть вычисления даты, а другая - для хранения этих идентификаторов записи, чтобы я мог их перебирать. Возможно, эхо их в файл tmp - это то, что происходит с места в карьер.

Для части расчета даты - я пробовал это, и он работает. Но не уверен, что если он будет колебаться некоторое время/ситуации

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

Так дали recordID1 в 20100328 У меня есть 32 дней RecordId, чтобы искать в этом каталоге. Вы должны указать даты на 32 дня с recordID1 и сохранить их в определенном месте. Как лучше всего это сделать.

ответ

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' должен забрать каждую часть.001 и part002 файл для 20130930 и 201310301. Изолируйте recordID - yyyymmdd из этих и имен файлов. Для этого каталога - дайте мне все файлы, соответствующие этому диапазону и их идентификатор записи (повторите эти имена) снова TY – user1874594

Смежные вопросы