2017-03-09 53 views
1

我有以下挑战: 想象您需要能够根据请求扫描的广泛积压。 目录结构基本上是这样的:bash脚本动态设置导演范围

/basedirectory/2016/01/01/uniquenamedir1/session_timestamp.log 
/basedirectory/2016/01/01/uniquenamedir1/session_timestamp.log 
/basedirectory/2016/01/01/uniquenamedir1/etc.. 
/basedirectory/2016/01/01/uniquenamedir2/session_timestamp.log 
/basedirectory/2016/01/01/etc../session_timestamp.log 
/basedirectory/2016/01/02/uniquenamedir2/session_timestamp.log 
/basedirectory/yyyy/mm/dd/etc.../session_timestamp^n.log 

你明白了。 如果我想列出一个具体的日期范围的日志,我可以用这样简单的东西:

ls /basedirectory/2017/01/{04..18}/*/*.log 
# or 
ls /basedirectory/2017/01/{04,05,06}/*/*.log 
# or even 
d1="2017/01/04" 
d2="2017/01/05" 
d3="2017/01/06" 
ls /basedirectory/{"$d1","$d2""$d3"}/*/*.log 

但我怎么能保持这种简单而有效的与动态日期和范围的脚本?


这是一个例子:

#user can set date 
start_date="2017-03-07" 
#user can set amount of days 
day_range="2" 
#catch date range in this array: 
date_range=() 

#When using in a function, date_range_tmp will be a local. 
#Using it to set global date_range 
declare -a 'date_range_tmp=($(echo {'"$day_range"'..0} | xargs -I{} -d " " date -d "'"$start_date"' +{} day" --rfc-3339="date"))' 
date_range=("${date_range_tmp[@]}") 

echo "${date_range[*])" 
#2017-03-07 2017-03-08 2017-03-09 

test1="${date_range[0]}" 
#test1=2017-03-07 

test2="${date_range[-1]}" 
#test2=2017-03-09 

test3="$(IFS=\, ; echo "${date_range[*]//-/\/}")" 
#test3=2017/03/07,2017/03/08,2017/03/09 

#This, unfortunately will NOT work: 

ls /basedirectory/{"$test1".."$test2"}/*/*.log 
# or 
ls /basedirectory/{"$test3"}/*/*.log 

注:我使用 'LS' 这里简单。我想在脚本中使用它来“grep”文件,但将其缩小到相关日期。

+0

是否在日期对应的日期创建日志?如果是这样,你可以使用'find'和'ctime'标志来分析创建时间 – Aserre

+0

不幸的不是。它是批量复制的,有时是从现场手动复制到备份。 – Asgair

回答

0

我更喜欢不使用“eval”,因为它通常会皱起眉头。 (我理解它的方式,就像使用松散的佳能。)在这里看到更好的解释:why to avoid eval

由于我们要走这条路,你不必穿过循环(双关语)当你使用eval时。

start_date="2017-03-09" 
day_range="-2" 
declare -a 'date_range=($(echo {'"$day_range"'..0} | xargs -I{} -d " " date -d "'"$start_date"' +{} day" --rfc-3339="date"))' 

ls_path="/basedirectory/{$(IFS=\, ; echo "${date_range[*]//-/\/}")}/*/*.log" 
#ls_path=/basedirectory/{2017/03/07,2017/03/08,2017/03/09}/*/*.log 

eval ls $ls_path 

这个工作没有循环放慢速度。但我打开其他解决方案,不使用循环或评估

或者,我可以将它传递给子shell。我不确定这是否有任何缺点:

bash -c "ls $ls_path" 

这似乎按预期工作。