tar – 폐기 디렉토리 구조 추출


34

unzip은 멋진 옵션을 가지고있어 -j아카이브의 디렉토리 구조를 버리고 모든 파일을 동일한 디렉토리로 추출합니다.

만드는 방법이 tar같은 방식으로 사용할 수 있습니까? 매뉴얼 페이지에 아무것도 표시하지 않는 것 같습니다.

그렇다면이를 가능하게 해줄 대안, 가급적 자유 소프트웨어 도구가 있습니까?


답변:


79

GNU 타르는 기능성 염에 살고 있으므로 당연히 이에 대한 몇 가지 옵션이 있습니다.
http://www.gnu.org/software/tar/manual/html_node/transform.html

당신은 다음 몇 가지 경로 세그먼트를 제거하려는 경우 --strip-components=n또는 --strip=n자주 할 것입니다 :

 tar xvzf tgz --strip=1

그러나 추출 할 파일을 정규식으로 다시 작성할 수도 있습니다 (플래그가 --transform있거나 수정 자를 --xform사용하여 ereg를 허용 함 /x).

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

타르를 나열하려면 추가 --show-transformed옵션 이 필요합니다 .

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

나는 다시 쓰기 옵션이 추출뿐만 아니라 포장에도 효과적이라고 생각합니다. 그러나 pax분명히 더 좋은 구문이 있습니다.


4
왜 안돼 s#.*/##?
l0b0

3
-스트립이 방금 날 만들었습니다. 감사!
SamStephens

--stripos x tar man 페이지에 언급되지 않았지만 어쨌든 작동합니다. 감사합니다!
slf

3
허용 된 답변보다 훨씬 낫습니다.
Klaatu von Schlacker

--strip와 사이에 차이점이 --strip-components있습니까?
Joel Berkeley

13

두 단계로 쉽게 수행 할 수 있습니다. 필요에 따라 조정하십시오.

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree

이것은 내가하는 방법입니다 (. find -exec mv -i대신 사용 find | xargs) .... 간단한 단계 스크립트를 수행하지 않고도 모든 시스템에서 반복 할 수 있습니다.
quack quixote

1
+1, tmpdir=$( mktemp -d )임시 디렉토리를 만들 때 편리합니다
sorki

8

pax 할 수있어:

pax -v -r -s '/.*\///p' < archive.tar

또는

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

-r옵션 을 생략하여 이름 교체 작업을 먼저 확인할 수 있습니다 .


1

아무것도 설치하지 않아도되는 가능한 솔루션입니다.

  1. a tar tvf를 사용 하여 tarball에서 모든 파일을 가져옵니다.
  2. 해당 파일을 개별적으로 추출하십시오-tar를 stdout으로 추출하고 $ filename으로 리디렉션하십시오.

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

extract.sh로 저장하고로 실행하십시오 extract.sh myfile.tar. 또한 tarball에서 가져온 디렉토리에서 발견 된 중복 파일 이름을 덮어 씁니다.


실제로 방금 집의 디렉토리에서 테스트했으며 공백이 포함 된 파일에서는 실패합니다. 업데이트를 게시 할 수 없는지 확인할 수 있습니다.
DaveParillo

그것을 고쳤다. 그러나 그것은 거의 예쁘지 않다.
DaveParillo

-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

-O옵션은 파일을 표준 >출력으로 추출하고 해당 출력을 파일로 리디렉션합니다. 내 예에서는 foo.mp3을 추출하여 bar.mp3로 리디렉션합니다. 파일 이름은 임의적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.