.gz 파일을 말려 압축을 풉니 다


13

주어진 URL에서 일부 .gz파일 (NB가 아닌 파일) 을 다운로드 .tar.gz하고 압축을 풀어 기존 파일을 덮어 쓰려고합니다.

각 개별 다운로드에 대해 다음을 시도했습니다.

curl -O $URL | gunzip -f

그러나 다음과 같이 실패했기 때문에 작동하지 않았습니다 gzip: stdin: unexpected end of file. 나는이 명령을 bash 쉘 스크립트 안에서 실행했다.

명령을 두 가지 명시 적 단계, 예를 들어 먼저 파일을 다운로드 한 다음 압축을 풀면 .gz작동합니다.

파이프 버전이 작동하지 않는 이유는 무엇입니까?


1
당신은 있는지 있습니까 curl -O실제로 표준 출력에 파일을 스트리밍? 아마도 당신은 생각하고 wget -O-있습니까?
steeldriver

@steeldriver 당신은 답변 컬로 게시해야합니다 | tar xz ...
Panther

--compressed있지만 압축 된 응답에 대해서만 작동합니다.
kenorb

답변:


18

파이프 ( |기호로 표시)는 한 프로세스 의 표준 출력 을 다른 프로세스의 표준 입력 으로 보냅니다 . 귀하의 경우 명명 된 파일을 사용하여 파이프가 적합하지 않은 것처럼 보입니다. 특히 gunzip원격 내용이 로컬 파일로 이동하기 때문에 파이프 할 것이 없습니다 (따라서 오류). 대신 URL에서 파일 이름 (예 : bash의 내장 문자열 조작 기능 사용)을 추출해야합니다.

curl -O "$URL" && gunzip -f "${URL##*/}"

파이프를 사용하려면 파이프를 만드는 방법은 다음과 같습니다.

curl "$URL" | gunzip -c

( -O옵션 없이 ) curl원격 컨텐트를 stdout파이프 할 수있는 곳으로 스트리밍 gunzip하지만 gunzip, 대상 압축되지 않은 파일을 적절히 덮어 쓰려면 출력을 리디렉션해야합니다 .


6

다운로드 할 때 리디렉션을 따르십시오. 때로는 웹 서버에 보안 및 / 또는 임의의 이유로 숨겨진 리디렉션이 있습니다. 리디렉션을 따르지 않으면 잘못된 데이터가 다운로드되고 파이프 된 데이터를 읽는 응용 프로그램이 혼동됩니다. -L 플래그를 사용하여 curl을 사용하여 경로 재 지정을 따를 수 있습니다.

curl -L https://example.com/mygzip.tar.gz | tar zxv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.