bash脚本动态设置目录范围

bash脚本动态设置目录范围,bash,grep,ls,curly-braces,variable-expansion,Bash,Grep,Ls,Curly Braces,Variable Expansion,我面临以下挑战: 想象一下,您需要能够根据请求扫描大量积压工作。 目录结构基本上是这样的: /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/uniqu

我面临以下挑战: 想象一下,您需要能够根据请求扫描大量积压工作。 目录结构基本上是这样的:

/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”文件的脚本中使用它,但要将其缩小到相关日期。

我不喜欢使用“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"
这似乎是有意的

我不喜欢使用“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"

这似乎是有意的

日志是否在与日期对应的日期创建?如果是这样,您可以使用
find
ctime
标志来分析创建时间。它是批量复制的,有时是手动从live复制到backup。日志是在与日期对应的日期创建的吗?如果是这样,您可以使用
find
ctime
标志来分析创建时间。它是批量复制的,有时是手动从实时复制到备份。