2017-03-10 8 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

경로 이름 생성은 경로 이름 구성 요소에만 패턴을 적용합니다. 구성 요소를 구분하는 /과 일치하지 않습니다. 중괄호 확장은 청소기 여기에있을 것입니다 :

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'와 같습니다. 그러나 이것은 작동합니다 :'var2 = "27 | 28"ls/basedir/2017/02/@ ("$ var2")/*/files.log' – Asgair

0

좋아, 내가 동적으로 해결 한 방법은 다음과 같이이다 : 당신은 당신이 파일을 사용할 수없는 경우 GREP 데이터를 가져 오기 위해 같은 도구와 함께 사용하려는 경우

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

이 더 유용합니다 -creation-dates.