stdin에서 추출 할 때 tar가 자동으로 압축 유형을 감지하도록 허용


15

GNU tar를 사용합니다. 파일 압축 / 압축 해제시 압축 유형을 자동 감지 할 수 있습니다. 그러나 stdin에서 아카이브를 압축 해제해야하며 압축 유형을 알 수 없습니다. 나는 tar가 다음과 같은 올바른 제안을 줄 수 있음을 알았습니다.

tar: Archive is compressed. Use -z option

그러나 tar가 해당 인수를 입력하도록 요구하지 않고 압축 옵션을 자동으로 사용하기를 원합니다 . 어떻게해야합니까? tar는 압축 유형을 이미 알고 있기 때문에 압축을 풀지 않는 이유는 무엇입니까?

고맙습니다!


개발하기는 어렵지 않았지만 지금까지는 이루어지지 않았습니다.
peterh December

3
이것이 불가능한 이유 tar는 데이터를 stdin읽은 후에야 어떤 유형의 데이터를 가지고 있는지 알 수 없기 때문에 압축 해제 프로그램을 호출하기에는 너무 늦습니다. gzip, bzip2 등을 지원합니다. 이 문제를 해결하는 것은 쉽지 않습니다 (데이터를 버퍼링해야 함). 다시 시도하도록 지시합니다.
Kevin Panko

@KevinPanko 왜 너무 늦었습니까? 아니요, 늦지 않았습니다. 그는 버퍼에서 첫 번째 4K를 읽고 압축 유형을 테스트 한 다음 (있는 경우) 프로그램을 호출합니다. 이 버퍼링은 10-20 줄의 추가 C 코드입니다.
peterh

2
어떤 데이터가 있는지 알고있는 시점에서 더 이상 간단한 fork()/ exec()메소드를 사용 하여 압축 해제 유틸리티를 통해 데이터를 파이프 할 수 없습니다 . 이 유틸리티는 stdin파이프 에서 읽을 수 있으며 이제 첫 번째 4K가 없습니다. 데이터를 읽은 후 파이프에 다시 넣을 방법이 없습니다.
Kevin Panko

3
@KevinPanko : 기본적으로와 동등한 두 가지 프로세스를 수행하여 수행 할 수 있습니다 cat buffer - | gunzip. (또는 추가적인 프로세스의 필요성을 피하기 위해 비 차단 I / O를 사용할 수도 있습니다.)
Ilmari Karonen

답변:


9

이것은 당신이 듣고 싶은 대답은 아니지만, GNU tar는 매뉴얼에 따라 지원하지 않습니다 :

아카이브를 읽는 동안 압축 해제 옵션을 지정해야하는 유일한 경우는 파이프 또는 임의 액세스를 지원하지 않는 테이프 드라이브에서 읽을 때입니다. 그러나이 경우 GNU tar는 사용해야하는 옵션을 나타냅니다. 예를 들면 다음과 같습니다.

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

이러한 진단이 표시되면 GNU tar 호출에 제안 된 옵션을 추가하십시오.

$ cat archive.tar.gz | tar tzf -

- 8.1.1 작성 및 읽기 압축 아카이브


2
이것은 OSX의 tar 명령에서 작동하지만 GNU tar를 사용하는 Linux에서는 작동하지 않습니다. 그래서 이것은 고칠 있습니다.
Sean Perry

7

마지막으로 tar가 stdin에서 아카이브를 감지하고 압축을 풀 수없는 이유는 GNU tar를 사용한다는 것입니다. BSD tar는 문제없이 자동으로 수행 할 수 있습니다. 이제 스크립트에서 tar 대신 bsdtar를 사용하기로 결정했습니다.

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