2016-07-12 2 views
2

내 목표는 특정 파일 이름 패턴을 제외하고 특정 텍스트 패턴을 파일 계층 구조로 검색하고 일치하는 파일 만을 로컬 디렉토리는 confs입니다. 다음 스크립트는 작업을 수행합니다저장 방법 - bash 스크립트의 환경 변수에 grep의 인수 제외

#!/bin/bash 
export FEXCLUDE="{*edit,*debug,*orig,*BAK,*bak,*fcs,*NOPE,*tomcat,*full.xml,*-ha.xml}"; 
export SRCDIR=/opt/jboss-as-7.1.1.Final/standalone; 

confshow() { 
    for ii in `grep -rlZ \ 
    --exclude={*edit,*debug,*orig,*BAK,*bak,*fcs,*NOPE,*tomcat,*full.xml,*-ha.xml} \ 
    --exclude-dir={log,tmp,i2b2.war,*.log,*_history,*.old} "<datasource\|username\|password\|user-name" \ 
    $SRCDIR/* | xargs -0 ls {}` ; 
    do cp --parents $ii confs; 
    done; 
} 

그러나, 제외 패턴이 자주 업데이트를 필요로 할 가능성이 높다 및 기타 기능들과 공유해야 할 수 있습니다를, 그래서의 시작 부분에 선언 된 변수에 그들 모두를 선호 스크립트.

#!/bin/bash 
export FEXCLUDE="{*edit,*debug,*orig,*BAK,*bak,*fcs,*NOPE,*tomcat,*full.xml,*-ha.xml}"; 
export SRCDIR=/opt/jboss-as-7.1.1.Final/standalone; 

confshow() { 
    for ii in `grep -rlZ \ 
    --exclude=$FEXCLUDE \ 
    --exclude-dir={log,tmp,i2b2.war,*.log,*_history,*.old} "<datasource\|username\|password\|user-name" \ 
    $SRCDIR/* | xargs -0 ls {}` ; 
    do cp --parents $ii confs; 
    done; 
} 

어떤 생각이 어떻게 원하는 동작을 얻을 : 나는 다음과 같은 작업을 수행 할 때 제외 할 파일은 confs 디렉토리에 복사하세요? 또는 $FEXCLUDE 인수 (echo이 잘못 표시되지 않음)가 전달되면 grep이 보는 것을 보는 방법은 무엇입니까?

감사합니다.

+0

이상한. 표현식에 따옴표가 필요 없기 때문에 따옴표로 FEXCLUDE 변수를 정의하는 이유가 궁금합니다. 없이 일해야한다. 한 번해볼 만하다. –

답변

1

나는 찡그림을 일으킬 것이라는 것을 알고 있지만 이것은 eval을 사용하여 해결할 수 있으며 --exclude= 인수에 패턴을 사용하기 때문에 일반적인 위험이 따르지 않을 수도 있습니다.

#!/bin/bash 

fexclude='{*edit,*debug,*orig,*BAK,*bak,*fcs,*NOPE,*tomcat,*full.xml,*-ha.xml}' 
dexclude='{log,tmp,i2b2.war,*.log,*_history,*.old}' 
srcdir=/opt/jboss-as-7.1.1.Final/standalone 

confshow() { 
    eval grep -rlZ \ 
    --exclude="$fexclude" \ 
    --exclude-dir="$dexclude" \ 
    "<datasource\|username\|password\|user-name" \ 
    $srcdir/* | xargs -0 -I {} cp --parents '{}' confs 
    done 
} 
+1

두 답에서 많은 것을 배웠고 두 분 모두에게 감사드립니다. 이 대답은 결국 효과가있었습니다. – f1r3br4nd

3

중괄호 확장은 대화 형으로 사용하는 것이 좋지만 스크립트를 작성하는 경우 편집기를 사용하여 필요한 --exclude 옵션을 빠르게 복사하고 배열에 저장하면됩니다. 매개 변수 확장은 중괄호 확장을 거치지 않습니다. ls 처치 애초에 grep에서 널 구분 출력을 사용하는 목적을 통해서도

#!/bin/bash 
# You didn't need to export these anyway, since only your script uses them 
FEXCLUDE=(--exclude '*edit' 
      --exclude '*debug' 
      # etc 
) 
DEXCLUDE=(--exclude-dir log 
      --exclude-dir tmp 
      # etc 
) 
SRCDIR=/opt/jboss-as-7.1.1.Final/standalone 

confshow() { 
while IFS= read -d'' -r ii; do 
    cp --parents "$ii" confs 
done < <(grep -rlZ "${FEXCLUDE[@]}" "${DEXCLUDE[@]}" "<datasource\|username\|password\|user-name" $SRCDIR/*) 

.

+0

이 소스는 오류없이 제공되지만 아무 것도 복사되지 않습니다. – f1r3br4nd

+0

실제 검색 패턴을 복사하는 것을 잊었습니다. – chepner

+0

@chepner :이 경우 대문자 변수 이름을 사용할 이유가 있습니까? –

관련 문제