it-swarm-ko.tech

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

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

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

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

그러나 이런 식으로 두 명령을 실행하고 첫 번째 명령의 완료가 다음 명령을 실행할 때까지 기다릴 필요가 있으며 파일의 이름 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이 두 번 실행되어 파일을 두 번 다운로드했습니다.

142
Andrew-Dufresne

Unzip 매뉴얼 페이지를 인용하여 임시 파일로 파일을 다운로드해야합니다.

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
105
tante

이것은 비슷한 질문에 my answer 의 게시물입니다.

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

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

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

인덱스를 사용할 수 없을 때 모든 Zip 압축 풀기 프로그램이 로컬 파일 헤더를 사용하는 것은 아니지만 tar 및 cpio 프론트 엔드는 라이브러리 (absdtar 및 bsdcpio) (== --- ==) can 및 will 파이프를 통해 읽을 때는 다음을 수행하십시오.

wget -qO- http://example.org/file.Zip | bsdtar -xvf-
84
ruario

JDK를 설치 한 경우 jar를 사용할 수 있습니다.

wget -qO- http://example.org/file.Zip | jar xvf /dev/stdin
22
Rory Hunter

Wget의 출력을 압축 해제로 귀찮게하고 싶지 않다고 생각합니다.

Wikipedia에서 "Zip (파일 형식)" 기사 :

Zip 파일은 파일의 끝에 위치한 중앙 디렉토리의 존재로 식별됩니다.

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

15
Bruce Ediger

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

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

그러나 오류 (Info-Zip on Debian) 때문에 작동하지 않습니다.

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 function 을 사용하여 끝에 파일 오프셋을 설정하여 중앙 디렉토리 레코드의 끝을 읽습니다. 아카이브 구조의 끝에 있으며 파일 목록을 읽어야합니다 ( Zip 파일 형식 구조 참조). 따라서 입력 오브젝트를 lseek 함수로 위치시킬 수 없으므로 파일은 FIFO, 파이프, 터미널 장치 또는 기타 동적 파일 일 수 없습니다.

따라서 다음 해결 방법이 있습니다.

  • 다른 종류의 압축을 사용하십시오 (예 : tar.gz),
  • 두 개의 별도 명령을 사용해야합니다
  • 대체 도구를 사용하십시오 (다른 답변에서 제안한대로).
  • 여러 명령을 사용하기 위해 별명 또는 함수를 작성하십시오.
11
kenorb

내 답변 의 다시 게시 :

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의 중복입니다.

배포판에서 기본적으로 BusyBox를 사용하는 경우 (예 : 알파인) unzip -를 실행하십시오.

11
Saftever

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 "[email protected]"
/bin/zcat:exec gzip -cd "[email protected]"
0
SebMa

Zip 아카이브는 순차적이지 않으므로 (파일 끝에 목차를 가질 수 있기 때문에) 압축을 풀기가 어렵습니다. .tar.gz와 같은 다른 파일 형식을 얻을 수 있는지 확인하십시오.

GitHub에서 .Zip 파일을 다운로드하는 경우 거의 항상 .tar.gz 버전이 있습니다.

예를 들어

패턴을 확인 하시겠습니까? .Zip.tar.gz로 바꾸고 | tar xzf -로 파이프하십시오.

0
rustyx