การสกัดน้ำมันดินขึ้นอยู่กับชื่อไฟล์?


33

ฉันมักจะดาวน์โหลด tarballs ด้วย wget จาก sourceforge.net

ไฟล์ที่ดาวน์โหลดจะถูกตั้งชื่อเช่น SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

เมื่อฉันพยายาม

tar xzf SQliteManager-1.2.4.tar.gz\?r\=http\:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F\&ts\=1305711521\&use_mirror\=switch

ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

tar (child): Cannot connect to SQliteManager-1.2.4.tar.gz?r=http: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now

หลังจากเปลี่ยนชื่อไฟล์ไปยังfoo.tar.gzการแยกการทำงานที่สมบูรณ์แบบ

มีวิธีที่ฉันไม่ได้บังคับให้เปลี่ยนชื่อทุกครั้งที่ไฟล์เป้าหมายก่อนที่จะแตก?

คำตอบ:


50

สาเหตุของข้อผิดพลาดที่คุณเห็นอยู่ในเอกสารของGNU tar :

หากชื่อไฟล์เก็บถาวรมีโคลอน (':') แสดงว่าเป็นไฟล์ในเครื่องอื่น [... ]

นั่นคือมันกำลังตีความSQliteManager-1.2.4.tar.gz?r=httpว่าเป็นชื่อโฮสต์และพยายามแก้ไขเป็นที่อยู่ IP ดังนั้นข้อผิดพลาด "การแก้ไขล้มเหลว"

เอกสารเดียวกันนั้นกล่าวต่อไปว่า:

หากคุณต้องการใช้ไฟล์ที่มีชื่อรวมถึงโคลอนพฤติกรรมของไดรฟ์เทประยะไกลสามารถถูกยับยั้งได้โดยใช้ตัวเลือก '--force-local'


โปรดทราบว่า--force-localจะต้องมีการเพิ่มก่อนf... --force-localเมื่อครั้งแรกที่ผมพยายามนี้มันก็ให้ฉันข้อผิดพลาดเกี่ยวกับวิธีไม่มีไฟล์เช่น บางทีนี่อาจเป็น "no duh" ด้วย แต่ฉันไม่รู้จักความผิดพลาดที่ฉันทำจนกระทั่ง 5 นาทีต่อมา
ArtOfWarfare

@ArtOfWarfare: fใช้อาร์กิวเมนต์ที่เป็น tarfile คุณไม่สามารถใส่--force-localระหว่างfและโต้แย้ง แต่ที่เป็นมาตรฐานสำหรับโปรแกรมทั้งหมดไม่เพียงและไม่เพียงtar -fคุณสามารถใส่--force-localหลังจากตราบใดที่มันยังเป็นหลังจากการโต้เถียงไปf f
camh

เหมือนที่ฉันพูดในความคิดเห็นของฉันอาจจะเกินไป "no duh" ฉันใช้น้ำมันดินแบบนี้tar -cvzf ...และอย่าคิดว่าธงแต่ละอันทำอะไรได้ 99% - มันแค่สะท้อนว่าฉันทำ tar.gz ได้
ArtOfWarfare

ในบันทึกนี้จะมีประโยชน์มากขึ้นกับสิ่งที่ทั้งสอง (@ArtOfWarfare และ @camh) กำลังพูดที่นี่เป็นตัวอย่าง: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
ดร. แดน

6

เมื่อคุณดาวน์โหลดด้วยwgetให้ระบุชื่อไฟล์ที่ส่งออกด้วย-Oตัวเลือก

wget "http://domain.com/file.tgz?crazy=args&stuff=todelete" -O file.tgz

สิ่งนี้จะทำให้ไฟล์บันทึกด้วยชื่อไฟล์ที่กำหนดและช่วยคุณแก้ปัญหาหรือเปลี่ยนชื่อไฟล์ และไม่คุณไม่ใช่คนเดียวที่หวังว่า sourcefourge จะไม่งี่เง่าที่จะส่งไฟล์ที่มีพารามิเตอร์ url ติดมาด้วย


นี่ไม่ใช่ความผิดของ SourceForge แต่wgetเป็น ใช้--content-dispositionแฟล็กเพื่อบันทึกด้วยชื่อไฟล์ที่เซิร์ฟเวอร์ระบุ (แต่ระวังถึงผลกระทบด้านความปลอดภัยเนื่องจาก SourceForge สามารถเขียนไปยังชื่อไฟล์โดยพลการ)
pcworld

4

ดาวน์โหลดโดยใช้

wget --trust-server-names URL

ด้วยวิธีนี้ wget จะบันทึกด้วยชื่อไฟล์ที่ถูกต้อง โดยค่าเริ่มต้นจะใช้องค์ประกอบสุดท้ายใน URL

สำหรับเช่น

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download

4

ดังที่อ้างถึงข้างต้น:(คอลัมน์) ทำให้tarคิดว่าเป็นไฟล์ระยะไกล ดังนั้นเราจำเป็นต้องบังคับใช้ความจริงที่เป็นในท้องถิ่น

ล้มเหลว

$ tar czf "back$(date -u +"%H:%M").tar.gz" ./
tar (child): Cannot connect to back10: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now

วิธีการแก้

ชี้แจงข้อเท็จจริงว่าเป็นไฟล์ในเครื่องโดยการต่อท้าย./(ไดเรกทอรีปัจจุบัน) และอ้างอย่างถูกต้อง:

$ tar czf ./"back$(date -u +'%H:%M').tar.gz" ./
tar: .: file changed as we read it

คำเตือนเกิดจากข้อเท็จจริงที่ฉันกำลังสร้างในไดเรกทอรีแหล่งที่มา


ดีกว่าการใช้ธงยาว นอกจากนี้ฉันเชื่อว่าการดาวน์โหลดโฮสต์ระยะไกลเป็นตัวเลือกที่ไร้ประโยชน์ในขณะที่มีเครื่องมือเฉพาะเพื่อให้บรรลุวัตถุประสงค์นี้
Alireza Mohamadi

3

สำหรับไฟล์ที่ดาวน์โหลดไปแล้วสิ่งนี้น่าจะใช้ได้:

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