2012-03-23 10 views
0

불편한 주제 이름을 사용하여 죄송합니다. 문제를보고 나서 더 맞는 제목을 찾으면 자유롭게 편집하십시오. 코드 샘플은 그래서 여기에 우리가 간다, 1000 개 단어 같다 :bash에서 명령의 파이프 시퀀스 내에서 조건부 명령 실행

if [ "$REGEX" != "" ]; then 
     find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |         
     grep -E $REGEX | 
     awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' | 
     while read -r line; do mv -f $line; done 
else 
     find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' | 
     awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' | 
     while read -r line; do mv -f $line; done 
fi 

않는 모든 중요하지 않다 무엇 코드, 그냥 "그렙 -E $ REGEX"를 사용하는 하나 더 우아한 방법을 찾으려면 아닙니다. 나는 쉘 사용법에서 익숙해 진 것과 같이 conditdonal aliases가 작업을 수행 할 수 있다고 생각했지만 스크립트 안에서는 작동하지 않는다.

여러 가지 평가에서 성능에 영향을 줄 수 있습니다.

코드를 "더 우아하게"만들 수있는 방법은 무엇입니까?

+0

조금 더 나은 입출력을 설명 할 수 있습니까? –

+0

@CarlNorum 필요 없다고 생각하지만, 먼저'{status, stderr, stdout} -captured'와 일치하는 파일에 대한 인쇄 경로를 찾고, grep -E $ REGEX로 필터링합니다. awk, sed와 read는 실행 된'mv ./dir/status-captured./dir/status-expected'에'./dir/status-captured'를 넣고이 예제를 조립합니다 : . – AoeAoe

답변

1

한 가지 간단한 방법은 ^ 사용하는 것입니다 (항상 일치 : 뜻 "을 시작으로 온라인"모든 라인이있다,) $REGEX가 설정 또는 비어있는 경우 :

find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' | 
grep -E ${REGEX:-^} | 
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' | 
while read -r line; do mv -f $line; done 

그 문제를 들어,

find $TEST_DIR -type f -regextype posix-extended \ 
    -regex '^.*(status|stderr|stdout)-captured$' \ 
    -regex ".*${REGEX}.*" | 
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' | 
while read -r line; do mv -f $line; done 

을 그 문제에 관해서는, 당신은뿐만 아니라 find으로 스크립트의 나머지 부분을 모두 병합 할 수 있습니다 : : 원래 find로 결합 할 수 있습니다

find $TEST_DIR -type f -regextype posix-extended \ 
    -regex '^.*(status|stderr|stdout)-captured$' \ 
    -regex ".*${REGEX}.*" \ 
    -exec bash -c 'file="{}" ; mv -f "$file" "${file%-captured}-expected"' \; 
+0

흥미롭게도 첫 번째 변형은 내 테스트 트리에서 가장 잘 수행됩니다. 정말로 흥미로운 해답을 가져 주셔서 감사합니다. – AoeAoe

+0

@AoeAoe : 안녕하세요. – ruakh

1

매우 간단한 해결책은 : cmd를 정의하면,이 파이프에 사용

test -n "$REGEX" && cmd="grep -E $REGEX" 
find ... | ${cmd-cat} | awk ... 

. 그렇지 않으면 고양이가 사용되어 노 작업을 수행합니다. 또한 수행 할 수 있습니다

find ... | 
if test -n "$REGEX"; then 
    grep -E $REGEX 
else 
    cat 
fi | 
awk ... 

을 정확히 같은 효과.

0

다음은 약간 못 생겼지 만 일반적인 해결책입니다.

find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' \ 
| if [ "$REGEX" != "" ]; then 
     grep -E $REGEX; \ 
    else \ 
     cat; \ 
    fi \ 
| awk '{print(""$1" "$1)}' \ 
| sed 's/-captured$/-expected/' \ 
| while read -r line; do mv -f $line; done