2014-06-06 2 views
0

을 추출 그래서 나는tar 파일에서 특정 문자열 패턴을 찾기하지만 그 특정 파일

내가 패턴을 검색 및 발견에 대한 해결책이 주어졌다 그래서 하나의 페이지 - 2 개 질문을하지 않은 새 스레드를 만들고 싶었다 그리고 추출하지 않고 tar ball 형태의 파일 문자열 :

이 내가 주어진 것입니다 :

tar xzf archive.tgz --to-command \ 
    'grep --label="$TAR_FILENAME" -H PATTERN ; true' 

내가 가지 this-을 해석하는 방법에 잃었어요 내가 넣을 수이 뭔가 스크립트? 또한 특정 위치로 압축을 풀기 위해 특정 파일을 파이핑하는 방법은 무엇입니까?

나는 (스크립트의 경우) 현재로서는이있다, 그러나이 맞다면 나도 몰라 :

TAR_FILENAME=$1 
PATTERN=$2 

for i in $(tar -tf $TAR_FILENAME | grep -v '/$') ; do 
    if tar xOzf test.tar.gz $i | grep -q "$PATTERN" ; then 
     tar xzf $i ; 
    fi ; 
done 
: 여기
TAR_FILENAME=$1 
PATTERN=$2 

tar xzf archive.tgz --to-command \ 
    'grep --label="$TAR_FILENAME" -H PATTERN ; true' 

답변

0

당신은 아마 사용할 수있는 작은 스크립트입니다

원하는대로해야합니다. 이제

나 자신의 라인으로 explainations을 시작하자 :

tar xzf archive.tgz --to-command \ 
    'grep --label="$TAR_FILENAME" -H $PATTERN ; true' 

첫 번째 줄 추출물 (x) 이름이 $TAR_FILENAME (f)에와 gzip (z)로 압축 된 파일; tar (--to-command)에서 외부 명령으로 파이프합니다.

그래서 실제로는 tarball을 추출하지만 데이터는 디스크에 기록되지 않습니다. 대신 grep 명령으로 전송되며 $PATTERN을 검색합니다. 옵션 --label=-H은 tarball의 이름을 인쇄하기위한 것이지만 패턴이있는 원본 파일은 아닙니다 (자세한 내용은 매뉴얼 페이지의 grep 설명서 참조).

grep이 적어도 하나의 발생을 발견하면 $PATTERN의 실행 종료시 0을 반환합니다. 그렇지 않으면 tar으로 해석되는 1을 오류 값으로 반환합니다. 이를 방지하기 위해 tar이라는 외부 명령이 0을 반환하는지 확인합니다. true이라고합니다.

코드가하는 일은 모든 파일을 추출하고 grep에 파이핑하여 패턴을 찾고이 패턴의 출현을 타르볼 이름과 함께 인쇄하는 것입니다.

for all files in tarball, do 
    extract file to standard output and pipe it to grep 
    use grep to search $PATTERN 
    if $PATTERN is found 
    extract this file to disk 
    endif 
endfor 

상세 사항 :

tar -tf $TAR_FILENAME | grep -v '/$' 

인쇄 타르에있는 파일 및 제외 목록 (grep에 대한 -v 옵션) /로 끝나는 파일을 지금

,의는 의사 코드 내 제안을 살펴 보자 , 디렉토리 (우리는 grep에 디렉토리를 파이프하기를 원하지 않습니다).

그래서 우리는이 목록을 인쇄하고시 for 루프를 실행 : 모든 thoose 파일, 표준 출력 (tar에 대한 O 옵션)로 exract 및 $PATTERN를 검색합니다. -q 옵션을 사용하면 grep에서 $PATTERN을 인쇄 할 수 없으므로 그 번호가 있는지 여부 만 알고 싶을뿐입니다. $PATTERN가 발견되면, grep 0을 반환 그래서 우리는 파일의 추출로 진행 : 그렇지

tar xzf $i 

는, 아무 일도 발생하지 않고 우리는 다음 파일을 계속합니다.

관련 문제