wget의 출력을 압축 해제에 대한 입력으로 리디렉션하는 방법은 무엇입니까?

링크 에서 파일을 다운로드해야합니다. 파일 다운로드는 현재 폴더에서 압축을 풀어야하는 zip 파일입니다.

일반적으로 먼저 다운로드 한 다음 unzip 명령을 실행합니다.

$ wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip $ unzip temp.zip 

하지만 이런 식으로 두 개의 명령을 실행해야합니다. 첫 번째 명령이 완료 될 때까지 기다렸다가 다음 명령을 실행해야합니다. 또한 파일 이름 를 unzip에 제공합니다.

wget의 출력을 unzip?

$ unzip < `wget http://www.vim.org/scripts/download_script.php?src_id=11834` 

하지만 작동하지 않았습니다.

bash : wget http://www.vim.org/scripts/download_script.php?src_id=11834 -O temp.zip : 모호한 리디렉션

또한 wget가 두 번 실행되었습니다. , 파일을 두 번 다운로드했습니다.

주석

  • 후자의 예에서는?가 쉘의 특수 문자이기 때문에 wget이 두 번 실행되었을 것입니다. . URL을 ” “에 넣으면 도움이 될 것입니다.
  • 이 스레드에 해결책이있는 것 같습니다. 헤이븐 ‘하지만 직접 시도하지는 않았습니다. serverfault.com/questions/26474/ …

답변

파일을 임시 파일로 다운로드해야합니다. man page) :

funzip을 사용하는 경우를 제외하고 표준 입력에서 읽은 아카이브는 아직 지원되지 않습니다. 아카이브의 불씨를 추출 할 수 있습니다.

다음 명령을 함께 가져옵니다.

wget "http://www.vim.org/scripts/download_script.php?src_id=11834" -O temp.zip unzip temp.zip rm temp.zip 

하지만 좀 더 유연하게하려면 스크립트에 넣어서 입력을 절약하고 실수로 덮어 쓰지 않도록 mktemp 명령을 사용하여 임시 파일의 안전한 파일 이름을 만듭니다.

#!/bin/bash TMPFILE=`mktemp` PWD=`pwd` wget "$1" -O $TMPFILE unzip -d $PWD $TMPFILE rm $TMPFILE 

댓글

  • wget file.zip && unzip file.zip wget file.zip; unzip file.zip와 같습니까? 아니면 하나가 다른 것보다 선호됩니까? 감사합니다 🙂
  • @NextLocal wget && unzip는 wget이 성공한 경우에만 압축 해제를 실행합니다. wget ; unzip는 어쨌든 unzip을 실행하여 존재하지 않는 파일을 가리킬 것입니다.
  • funzip이 제가 찾고 있던 답이었습니다. Terraform (어떤 이유로 든)은 ‘ 바이너리를 zip 아카이브의 단일 파일로 패키징하므로 나에게 완벽했습니다.

답변

비슷한 질문에 대한 내 답변 을 다시 게시 한 것입니다.

ZIP 파일 형식은 아카이브 끝에 디렉토리 (색인)를 포함합니다. 이 디렉토리는 아카이브 내에서 각 파일이있는 위치를 나타내므로 전체 아카이브를 읽지 않고 신속하고 무작위로 액세스 할 수 있습니다.

이는 a를 통해 ZIP 아카이브를 읽으려고 할 때 문제를 일으키는 것으로 보입니다. 파이프는 인덱스가 끝까지 액세스되지 않으므로 파일을 완전히 읽고 더 이상 사용할 수 없게 될 때까지 개별 멤버를 올바르게 추출 할 수 없습니다. 따라서 아카이브가 파이프를 통해 제공 될 때 대부분의 ZIP 압축 해제 기가 단순히 실패한다는 것은 놀라운 일이 아닙니다.

아카이브 끝의 디렉토리는 파일 메타가있는 유일한 위치가 아닙니다. 정보는 아카이브에 저장됩니다. 또한 개별 항목은 중복성을 위해이 정보를 로컬 파일 헤더에 포함합니다.

모든 ZIP 압축 해제 기가 인덱스를 사용할 수 없을 때 로컬 파일 헤더를 사용하는 것은 아니지만 tar 및 cpio 프런트 엔드는 libarchive (일명 bsdtar 및 bsdcpio)로 가능하며 다음과 같은 경우에 사용할 수 있습니다. 파이프를 통해 읽기. 이는 다음이 가능함을 의미합니다.

wget -qO- http://example.org/file.zip | bsdtar -xvf- 

댓글

  • 이것은 훌륭합니다. ! tar는 압축되지 않은 데이터가 잘못된 크기 (0으로 예상 됨)라는 경고를 표시하지만 파일 자체는 손상되지 않은 것처럼 보입니다. 색인이 없기 때문인 것 같습니다.
  • 실행 권한이있는 파일이 포함 된 .zip-파일이 있습니다. bsdtar를 다운로드하고 파이프하면 exec 비트가 버려집니다. 디스크에 다운로드하고 bsdtar 또는 unzip로 압축을 풀면 exec 비트가 존중됩니다.
  • // , @GolarRamblar, 그 이유를 알아 내셨습니까?
  • @NathanBasanese : 여기 가 답입니다. 간단히 말해서 ZIP 아카이브에는 이러한 정보를 저장하는 두 위치가 있는데, 이는 일관성이 없을 수 있으며, bsdtar 파일 열기가 검색 가능한지 여부에 따라 하나 또는 다른 위치를 사용하는지 여부에 따라 다릅니다. .

답변

JDK가 설치되어있는 경우 jar :

wget -qO- http://example.org/file.zip | jar xvf /dev/stdin 

댓글

  • 방금 는 ‘ 파일 권한을 보존하지 않습니다. 그렇지 않으면 좋은 트릭입니다.
  • 파일 매개 변수를 제공 할 필요가 없습니다. ‘ | jar xv
  • 저도 jarunzip의 대체물로 사용될 수 있다는 가정에 물 렸습니다. 불행히도 jar는 추출 된 파일을 복원하지 않습니다 ‘ 권한;
  • | jar x
  • jar는 UTF-8 파일 이름을 훨씬 더 잘 처리합니다. unzip 일이 엉망이되었습니다.

답변

아니요 wget의 출력물을 압축 해제하는 것도 귀찮게 생각할 수 있습니다.

wikipedia “ZIP (파일 형식)” 기사에서 :

ZIP 파일은 파일 끝에있는 중앙 디렉토리의 존재로 식별됩니다.

wget은 압축 해제가 작업을 수행하기 전에 다운로드를 완전히 완료해야하므로 생각대로 짜여지지 않고 순차적으로 실행됩니다.

답변

내 답변 재 게시 :

BusyBox의 unzip는 stdin을 가져와 모든 파일을 추출 할 수 있습니다.

wget -qO- http://downloads.wordpress.org/plugin/akismet.2.5.3.zip | busybox unzip - 

unzip 뒤의 대시는 stdin을 사용하는 것입니다. 입력으로.

당신도 할 수 있습니다.

cat file.zip | busybox unzip - 

그러나 이것은 단지 unzip file.zip.

배포판에서 BusyBo를 사용하는 경우 x 기본 설정 (예 : Alpine), unzip -를 실행하세요.

댓글

  • @Saftever로 더 이동 ‘의 답변, ‘ 댓글을 달 수 없습니다. busybox는 작동하지만 1.27.0 원 이전 버전 ‘ 중복 lseek로 인해 변경 로그를 참조하십시오. busybox.net

답변

올바른 구문은 다음과 같습니다.

$ unzip <(curl -sL https://www.winpcap.org/archive/1.0-docs.zip) 

하지만 오류로 인해 작동하지 않습니다 ( Debian Info-ZIP ) :

lseek(3, 0, SEEK_SET) = -1 ESPIPE (Illegal seek) Archive: /dev/fd/63 End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. unzip: cannot find zipfile directory in one of /dev/fd/63 or /dev/fd/63.zip, and cannot find /dev/fd/63.ZIP, period. 

또는 BSD / OS X :

Trying to read large file (> 2 GiB) without large file support 

이것은 표준 zip 도구가 주로 lseek 함수 중앙 디렉터리 레코드의 끝 을 읽기 위해 끝에서 파일 오프셋을 설정합니다. 아카이브 구조의 끝에 위치하며 목록을 읽어야합니다. 파일 수 (참조 : Zip 파일 형식 구조 ). 따라서 입력 개체는 lseek 함수로 위치를 지정할 수 없기 때문에 파일은 FIFO, 파이프, 터미널 장치 또는 기타 동적 일 수 없습니다.

다음 해결 방법 :

  • 다른 종류의 압축 사용 (예 : tar.gz),
  • 두 개의 개별 명령을 사용해야합니다.
  • 대체 도구 (다른 답변에서 제 안됨) 사용
  • 별명 또는 함수를 만들어 여러 명령을 사용합니다.

댓글

  • 아직도 FIFO 일 수 있을 수 있습니다. ‘ EOF까지 FIFO에서 계속 읽기만하면됩니다 (효과적으로 전체 FIFO를 메모리 또는 임시 파일에 버퍼링). 스크립트 작성을 쉽게 할 수 있지만 그다지 유용하지는 않습니다.

답변

파일이 하나만있는 경우 zip, zcat 또는 gunzip를 사용할 수 있습니다.

wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | gunzip 

참고 : 내 시스템의 gunzipzcat 정의는 다음과 같습니다.

$ grep ^exec $(which gunzip zcat) /bin/gunzip:exec gzip -d "$@" /bin/zcat:exec gzip -cd "$@" 

답변

zip 아카이브는 종종 목차가 있기 때문에 순차적이지 않습니다. 파일의 끝 부분에 있으므로 스트림 압축을 풀기가 어렵습니다.

대체 해결책은 .tar.gz.

예를 들어 GitHub에서 “.zip 파일을 다운로드하는 경우 거의 항상 .tar.gz 버전 사용 가능.

예 :

패턴에 유의하십시오. .zip.tar.gz로 바꾸고 | tar xzf -

답변

이것은 저에게 꽤 효과적입니다.

 tar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) jar xvf <(curl -sL http://www.vim.org/scripts/download_script.php?src_id=11834) wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | tar xvf - wget -qO- http://www.vim.org/scripts/download_script.php?src_id=11834 | jar xvf -  

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다