2017-03-10 1 views
5

Bash用の「拡張パターン」extglobを見つけました。私は単純に書くことができますディレクトリ2017/02/272017/02/28のファイルを一覧表示したい場合は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 

はこのようなディレクトリ構造を想像してみて:http://wiki.bash-hackers.org/syntax/pattern

私はこの事件を捜査しています:

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

パス名生成は、パス名構成要素にのみパターンを適用します。コンポーネントを分離する/とは決して一致しません。ブレース展開はここでクリーンであろう最初の2つの得られたパターンにパス名の生成を行う前

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

に拡大する

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

+0

しかし、ブレースの拡張に関する唯一の問題は、範囲を動的に定義できないことです。 – Asgair

+1

拡張パターンではできませんので、何も失うことはありません:) – chepner

+0

Ok。それは残念です...私はまだ効率的なソリューションには近づいていません。私が持っている唯一の問題は、ブレースの拡張を動的に定義することができないということです。サブシェルで実行しない限り、 'var1 =" 02/28,03/01 "ls/basedir/2017 /" $ var1 "/ */files.log'のようなものです。しかし、これは動作します: 'var2 =" 27 | 28 "ls/basedir/2017/02/@(" $ var2 ")/ */files.log' – Asgair

0

[OK]を、私はこの動的に解決してきた方法は、このようなものです:

#!/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-dates。

関連する問題