2017-03-10 33 views
5

我偶然發現了Bash的「擴展模式」extglob。 http://wiki.bash-hackers.org/syntax/pattern在Bash擴展模式下逃跑@(..)

我們正在調查這種情況下:

想象一下這樣的目錄結構:

/basedir/2017/02/26/uniquedirs1/files.log 
/basedir/2017/02/27/uniquedirs2/files.log 
/basedir/2017/02/28/uniquedirs3/files.log 
/basedir/2017/03/01/uniquedirs4/files.log 
/basedir/2017/03/02/uniquedirs5/files.log 

如果我想列出目錄2017/02/272017/02/28我可以簡單的寫的文件:

ls /basedir/2017/02/@("27"|"28")/*/files.log 

太棒了! \ o/

現在的問題。我如何在Bash擴展模式中定義多個目錄?
這不起作用:

ls /basedir/2017/@("02/28"|"03/01")/*/files.log 
ls /basedir/2017/@("02\/28"|"03\/01")/*/files.log 

有什麼辦法可以定義「擴展模式」的多個目錄?

回答

4

路徑名的產生只將模式應用於路徑名組件;他們從未匹配分離組件的/。括號擴展將是清潔器的位置:

ls /basedir/2017/{2/28,3/01}/*/files.log 

這將在兩個得到的圖案進行路徑名代之前首先展​​開到

ls /basedir/2017/2/28/*/files.log /basedir/2017/3/01/*/files.log 

+0

儘管大括號擴展的唯一問題是我無法動態定義範圍。 – Asgair

+1

你也不能使用擴展模式,所以你不會丟失任何東西:) – chepner

+0

好的。這是一種恥辱......我仍然沒有接近有效的解決方案。我遇到的唯一問題是無法動態定義括號擴展。像'var1 =「02/28,03/01」ls/basedir/2017 /「$ var1」/ */files.log',除非我在子shell中執行它。但是這樣做:'var2 =「27 | 28」ls/basedir/2017/02/@(「$ var2」)/ */files.log' – Asgair

0

好吧,我動態解決了這個方式,是這樣的:

#!/bin/bash 
# User input: 
start_date="2017-02-27" 
day_range=2 

# Logic: 

declare -a 'date_range=($(echo {'"$day_range"'..0} | xargs -I{} -d " " date -d "'"$start_date"' +{} day" --rfc-3339="date"))' 
#this creates an array with dates: 
#2017-03-02 2017-03-01 2017-02-28 2017-02-27 

eval ls "basedir/{$(IFS=\, ; echo "${date_range[*]//-//}")}/*/files.log" 
#this translates to: 
#ls basedir/{2017/03/01,2017/02/28,2017/02/27}/*/files.log 

,如果你想用的工具使用它一樣,如果你不能使用文件grep來獲取數據這是更爲有用-creation-日期。