.gz 파일을 컬링하고 압축 해제를 위해 파이프합니다.

.gz 파일을 컬링하고 압축 해제를 위해 파이프합니다.

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

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

curl -O $URL | gunzip -f

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

명령을 명시적인 두 단계, 즉 먼저 파일을 다운로드한 다음 파일의 압축을 풀면 .gz작동합니다.

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

답변1

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

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

파이프를 사용하고 싶다면 다음과 같은 방법을 사용하면 됩니다.

curl "$URL" | gunzip -c

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

답변2

다운로드할 때 리디렉션을 따르세요. 때때로 웹 서버에는 보안 및/또는 임의의 이유로 리디렉션이 숨겨져 있습니다. 리디렉션을 따르지 않으면 잘못된 데이터가 다운로드되고 파이프된 데이터를 읽는 애플리케이션이 혼란스러워집니다. -L 플래그를 사용하여 컬을 사용하여 리디렉션을 따를 수 있습니다.

curl -L https://example.com/mygzip.tar.gz | tar zxv

답변3

아래는 3가지 작업을 수행합니다.

    mkdir -p ${DIR} && curl -L http://apachemirror.wuchna.com/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz | tar zxv -C ${DIR} --strip-components 1
  1. 강제로 대상 디렉터리를 생성합니다.
  2. 지정된 디렉터리에 아카이브를 보관 취소합니다.
  3. 단순히 아카이브의 루트 디렉터리를 제거하여 루트 디렉터리를 지정된 디렉터리 이름으로 바꿉니다.

관련 정보