거대한 tgz 파일에서 단일 파일 추출


19

나는 거대한 tar 파일 (약 500G)을 가지고 있으며 단일 파일을 추출하고 싶지 않습니다.
그러나 내가 실행할 때 tar -xvf file.tgz path/to/file여전히 전체 내용을 메모리에로드하는 것처럼 보이고 추출하는 데 1 시간 이상이 걸립니다. 또한 --exclude=ignore.txtignore.txt가 쓸데없는 경로를 통과하지 못하도록 패턴 목록 을 사용 하려고 시도했지만 작동하지 않는 것 같습니다.

타르를 이해하지 못하는 것 같습니다 ... 파일을 빠르게 추출 할 수있는 방법이 있습니까?


나는 이것에 대해 궁금합니다. 내가 찾고 있어요 파일은 신속하게 발견하고 추출 - 다음 내가 처리 할 수있는 달성의 나머지 시간 동안 기다릴 필요가 : O (
maasha

답변:


14

불행히도, .tar.gz아카이브의 단일 멤버를 풀 려면 전체 아카이브를 처리해야하며 수정하기 위해 할 수있는 일은 많지 않습니다.

이것은 어디 .zip(일부 다른 형식이 좋아하는 .rar) 때문에 보관이 훨씬 더 잘 작동 zip형식은 모든 파일의 중앙 디렉토리가의 중앙을 가리키는 직접 오프셋과 그 안에 포함 된이 zip파일이므로 아카이브 멤버는 신속하게 모든 일을 처리하지 않고 추출 할 수 있습니다.

왜 처리 .tar.gz가 너무 느린 지 물을 수 있습니다 .

.tar.gz(종종 단축 .tgz) .tar압축기로 gzip압축 압축 된 것입니다. gzip하나의 파일로만 작동 할 수있는 스트리밍 압축기입니다. 당신의 어떤 부분 얻고 싶은 경우에 gzip스트림을, 당신은 전체로 압축을 해제해야하고,이 정말 그것을 죽이는 것입니다 .tar.gz(및 .tar.bz2, .tar.xz및 기타 유사한 형식에 기반 .tar).

.tar형식은 실제로 매우 간단합니다. 단순히 512 바이트 파일 또는 디렉토리 헤더 (이름, 크기 등)의 스트림이며 각각 뒤에 파일 또는 디렉토리 내용이 있습니다 (필요한 경우 0 바이트로 512 블록 크기로 채워짐). 헤더에 대해 완전히 널 512 블록을 관찰하면 이는 .tar아카이브의 끝을 의미 합니다.

어떤 사람들은 심지어 생각 .tar아카이브 멤버 빠르게 액세스 할 수 없습니다,하지만이 아닌 매우 사실. .tar아카이브에 큰 파일이 거의없는 경우 실제로 다음 헤더를 빠르게 찾을 수 있으므로 몇 번의 탐색으로 필요한 아카이브 구성원을 찾을 수 있습니다 (아직 아카이브 구성원이있는만큼의 탐색이 필요할 수 있음). .tar보관 파일에 작은 파일이 많이 포함되어 있으면 압축하지 않아도 빠른 회원 검색이 사실상 불가능 해집니다 .tar.


3
gzip은 압축되지 않은 데이터를 스트리밍 할 수 있으므로 모든 작업을 취소 할 필요가 없습니다. 그러나 .tar는 테이프 아카이브의 약자이므로 찾고있는 파일을 찾을 때까지 전체 파일을 탐색해야합니다. tar는 다른 것이있을 수 있기 때문에 계속 찾고 있지만 나중에 tar 파일에서 나중에 복사하십시오.
kurtm

9

당신은 큰 tar 파일에서 하나의 파일을 추출하는 경우, 당신은 GNU를 사용하고 tar, 그리고에 당신은 tar 파일이 추가 된 적이 있음을 보장 할 수 다음 사용하여 상당한 성능 향상을 얻을 수 있습니다 --occurrence.

이 옵션은 요청한 각 파일이 처음 나타나는 즉시 tar가 중지되도록합니다. 예를 들어

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

passwd및 의 각 하나의 사본을 찾은 후 전체 타르볼을 스풀링하지 shadow않고 대신 중지합니다. 이러한 파일이 거의 끝날 때 성능이 크게 향상되지는 않지만 500G 파일을 절반으로 표시하면 시간이 많이 절약됩니다.

tar단일 샷 백업을 사용하고 실제 테이프 드라이브를 사용하지 않는 사람들 에게는이 상황이 일반적 일 수 있습니다.

당신은 또한 전달할 수 있습니다 --occurrence=NUMBER당신이 거기 있음을 알고있는 경우에 도움이 각 파일의 NUMBERth 발생 검색 할 수 있는 아카이브에 여러 버전. 기본적으로 동작은 NUMBER1 과 같습니다 .


특정 파일이 먼저 나오도록 tar를 만드는 방법이 있습니까? 그래서 --occurrence첫 번째 파일에 즉시 걷어차 것? 파일 이름과 관련이 있다고 생각합니다. 예를 들어 aaaaa.jpg라는 것이 먼저 나올까요?
Jeff

1
@ 제프 :별로. 이는 tartarball에서 찾은 최신 버전의 파일을 계속 검색 하지 못하게 합니다. 대신 man 페이지에 표시된대로을 반환합니다 the Nth occurrence. 를 지정하면 하나 개의 명령 행에서 추출물 파일을 하고 당신이 말하는 --occurrence타르가 즉시 종료됩니다 다음은 해당 파일을 발견, 따라서 것처럼 효과적으로 상기 중지 "첫 번째 파일."
phogg

2

큰 타르볼 사용시 :

--fast-readpath/to/file이 경우 파일 이름 피연산자와 일치하는 첫 번째 아카이브 항목 만 추출합니다. 이 경우 항상 tarball에서 고유합니다.

tar -xvf file.tgz --fast-read path/to/file

위는 일치하는 것을 찾을 때까지 검색 한 다음 종료됩니다.


1
왜 이것이 여전히 0 포인트인지 이해하고 싶었습니다. man tar(GNU tar 1.29)는이 옵션도 인쇄하지 않습니다. 그러나 우분투는 기본적으로 활성화되어 있는 것 같습니다 . 빨리 읽고, --fast-read와 다른 점이 확실 하지 않습니다 --occurrence. 그러나 --occurrence우분투 페이지에는 없지만 페이지에 man tar있습니다. 인가 --fast-read--occurrence가능성이 같은 일?
Jeff

이러한 옵션 중 어느 것도 표준에 의해 지정되지 않으며 항상 비표준 옵션과 마찬가지로 시스템의 유틸리티가이를 지원하도록주의를 기울여야합니다. --occurrences 옵션은 GNU tar에서 지원됩니다. --fast-read 옵션은 Ubuntu에 의해 bsdtar로 패키지 된 최신 버전의 FreeBSD tar에서 지원됩니다. 자세한 내용은 여기 를 참조 하십시오 .
phogg

1

불행히도 tar 파일 형식에는 중앙 집중식 목차가 없으므로 특정 파일을 찾으려면 아카이브를 순차적으로 읽어야합니다. 그것은 원래 테이프 백업을 위해 설계되었습니다 ( "타르"에서 유래 t 원숭이 AR 어떤 경우에 이러한 작업을 지원하지 것이다, 골파).

따라서 기다려야 할 것입니다.

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