วิธีการเปลี่ยนเส้นทางการส่งออกของ wget เป็นอินพุตเพื่อคลายซิป?


131

ฉันต้องดาวน์โหลดไฟล์จากลิงค์นี้ การดาวน์โหลดไฟล์เป็นไฟล์ zip ซึ่งฉันจะต้องทำการแตกไฟล์ในโฟลเดอร์ปัจจุบัน

โดยปกติฉันจะดาวน์โหลดก่อนแล้วจึงเรียกใช้คำสั่ง unzip

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

แต่ในทางนี้ฉันต้องการที่จะดำเนินการทั้งสองคำสั่งรอให้เสร็จสิ้นการคนแรกที่จะดำเนินการอย่างใดอย่างหนึ่งต่อไปยังที่ฉันจะต้องรู้ว่าชื่อของไฟล์ที่จะให้มันไปtemp.zipunzip

มันเป็นไปได้ที่จะเปลี่ยนเส้นทางการส่งออกของ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 ใน "" ควรช่วยได้
p-static

กระทู้นี้ดูเหมือนจะมีทางออก ยังไม่ได้ลองด้วยตัวเอง serverfault.com/questions/26474/…

คำตอบ:


96

คุณต้องดาวน์โหลดไฟล์ของคุณไปที่ไฟล์ temp เพราะ (อ้างถึงหน้า unzip man):

การเก็บถาวรที่อ่านจากอินพุตมาตรฐานยังไม่ได้รับการสนับสนุนยกเว้นด้วย 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หรือเป็นหนึ่งที่แนะนำในช่วงอื่น ๆ ? ขอบคุณ :)
jaggedsoft

7
@NextLocal wget && unzipจะเปิดใช้งานการคลายซิปเฉพาะเมื่อการโหลดสำเร็จ wget ; unzipจะเปิดเครื่องรูดอย่างไรก็ตามอาจชี้ไปที่ไฟล์ที่ไม่มีอยู่
temoto

funzip คือคำตอบที่ฉันต้องการ แพ็คเกจ Terraform (ด้วยเหตุผลบางอย่าง) มันเป็นเลขฐานสองเป็นไฟล์เดียวในไฟล์ zip ดังนั้นนี่จึงเหมาะสำหรับฉัน
Asfand Qazi

74

นี่คือ repost ของคำตอบของฉันสำหรับคำถามที่คล้ายกัน:

รูปแบบไฟล์ ZIP มีไดเรกทอรี (ดัชนี) ที่ส่วนท้ายของไฟล์เก็บถาวร ไดเรกทอรีนี้บอกว่าที่ไหนอยู่ภายในไฟล์เก็บถาวรแต่ละไฟล์จะอยู่และทำให้สามารถเข้าถึงแบบสุ่มได้อย่างรวดเร็วโดยไม่ต้องอ่านไฟล์เก็บถาวรทั้งหมด

ดูเหมือนว่าจะมีปัญหาเมื่อพยายามอ่านไฟล์ ZIP ผ่านไปป์โดยที่ดัชนีจะไม่ถูกเข้าถึงจนกว่าจะถึงจุดสิ้นสุดและสมาชิกแต่ละคนจะไม่สามารถแยกไฟล์ได้อย่างถูกต้องจนกว่าจะอ่านไฟล์ทั้งหมดและไม่สามารถใช้งานได้อีกต่อไป . ดังนั้นจึงไม่น่าแปลกใจเลยที่ตัวบีบอัด ZIP ส่วนใหญ่จะล้มเหลวเมื่อทำการจัดเก็บลงสื่อถาวรผ่านไปป์

ไดเรกทอรีที่ส่วนท้ายของไฟล์เก็บถาวรไม่ใช่ตำแหน่งเดียวที่เก็บข้อมูลเมตาไฟล์ในไฟล์เก็บถาวร นอกจากนี้แต่ละรายการยังรวมข้อมูลนี้ไว้ในส่วนหัวของไฟล์ในเครื่องเพื่อการสำรองข้อมูล

แม้ว่าไม่ใช่ตัวบีบอัด ZIP ทุกตัวจะใช้ส่วนหัวของไฟล์ในเครื่องเมื่อดัชนีไม่พร้อมใช้งานหน้า tar และ cpio จะสิ้นสุดลงที่การจัดเก็บถาวร (aka bsdtar และ bsdcpio) สามารถทำได้เมื่ออ่านผ่านไพพ์หมายความว่าเป็นไปได้ดังต่อไปนี้:

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

1
มันยอดเยี่ยมมาก! ฉันจะทราบว่า tar ให้คำเตือนบางอย่างเกี่ยวกับข้อมูลที่ไม่บีบอัดให้มีขนาดไม่ถูกต้อง (คาดว่าเป็น 0) แต่ตัวไฟล์เองดูเหมือนจะไม่เสียหาย การคาดเดานี้เกิดจากการขาดดัชนี
ไวแอตต์ 8740

1
ฉันมี.zipไฟล์ที่นี่ที่มีไฟล์ที่มีสิทธิ์ในการปฏิบัติการ เมื่อฉันดาวน์โหลดและไปป์bsdtarบิต exec จะถูกโยนทิ้งไป เมื่อฉันดาวน์โหลดลงดิสก์และแตกไฟล์ด้วยbsdtarหรือไม่unzipก็บิต exec เป็นเกียรติ
Golar Ramblar

//, @GolarRamblar เคยรู้ไหมว่าทำไม?
Nathan Basanese

1
@NathanBasanese: นี่คือคำตอบ กล่าวโดยย่อ: ไฟล์เก็บถาวร ZIP มีสองแห่งที่จัดเก็บข้อมูลดังกล่าวซึ่งอาจไม่สอดคล้องกันและขึ้นอยู่กับว่าไฟล์ที่bsdtarเปิดนั้นสามารถค้นหาได้หรือไม่และจะใช้ที่ใดที่หนึ่งหรือที่อื่น
Golar Ramblar

20

หากคุณติดตั้ง JDK แล้วคุณสามารถใช้jar:

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

3
ฉันเพิ่งพบjarว่าไม่ได้สงวนสิทธิ์ไฟล์ เคล็ดลับดี
phunehehe

7
คุณไม่จำเป็นต้องให้พารามิเตอร์ไฟล์เพียงแค่ใช้| jar xv
cricket_007

15

ฉันไม่คิดว่าคุณต้องการรบกวนการบีบอัดไฟล์ของ wget เป็น unzip

จากบทความ"ZIP (รูปแบบไฟล์)"ของวิกิพีเดีย:

ไฟล์ ZIP ถูกระบุโดยการมีไดเรกทอรีกลางซึ่งอยู่ท้ายไฟล์

wget ต้องดาวน์โหลดจนเสร็จสมบูรณ์ก่อนที่ unzip จะสามารถทำงานใด ๆ ได้ดังนั้นพวกเขาจึงทำงานตามลำดับไม่ใช่การรวมกันอย่างที่คิด


10

ไวยากรณ์ที่เหมาะสมจะเป็น:

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

แต่มันจะไม่ทำงานเนื่องจากข้อผิดพลาด ( 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

นี้เป็นเพราะเครื่องมือซิปมาตรฐานส่วนใหญ่จะใช้lseekฟังก์ชั่นในการที่จะตั้งค่าไฟล์ชดเชยในตอนท้ายของการอ่านในตอนท้ายของบันทึกไดเรกทอรีกลาง ตั้งอยู่ที่ส่วนท้ายของโครงสร้างไฟล์เก็บถาวรและจำเป็นต้องอ่านรายการไฟล์ (ดู: โครงสร้างรูปแบบไฟล์ซิป ) ดังนั้นไฟล์ไม่สามารถเป็น FIFO, ไพพ์, อุปกรณ์เทอร์มินัลหรือไดนามิกอื่น ๆ ได้เนื่องจากlseekฟังก์ชั่นอินพุตไม่สามารถจัดตำแหน่งได้โดยฟังก์ชั่น

ดังนั้นคุณมีวิธีแก้ไขปัญหาต่อไปนี้:

  • ใช้การบีบอัดชนิดต่าง ๆ (เช่นtar.gz)
  • คุณต้องใช้สองคำสั่งแยกกัน
  • ใช้เครื่องมือทางเลือก (ตามที่แนะนำในคำตอบอื่น ๆ )
  • สร้างนามแฝงหรือฟังก์ชั่นเพื่อใช้หลายคำสั่ง

ฉันคิดว่ามันอาจจะเป็น FIFO คุณเพียงแค่ต้องอ่านต่อจาก FIFO จนถึง EOF (บัฟเฟอร์ FIFO ทั้งหมดในหน่วยความจำหรือในไฟล์ temp) ทำได้อย่างสมบูรณ์เพื่อความสะดวกในการสร้างสคริปต์ แต่ไม่มีประโยชน์มาก
Evan Carroll

8

โพสต์คำตอบของฉัน :

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แต่นั่นเป็นเพียงซ้ำซ้อนของ

หากคุณใช้ distro BusyBox โดยค่าเริ่มต้น (เช่นอัลไพน์) unzip -เพียงแค่เรียกใช้


เคล็ดลับที่มีประโยชน์มากขอบคุณ!
Brice

-1

มันใช้งานได้ดีสำหรับฉัน:

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 -
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.