ยกโทษให้กับคำถามพื้นฐานที่สุด แต่ฉันไม่สามารถหาคำตอบโดยตรงหรือตัวอย่างง่ายๆในการแลกเปลี่ยนสแต็ค
สมมติว่าฉันมีโฟลเดอร์ของไฟล์ที่ฉันต้องการบีบอัดเป็นไฟล์ zip หนึ่งไฟล์ที่ฉันสามารถแบ่งปันกับเพื่อน Windows ที่น่ากลัวของฉันtar
ได้ ดูเหมือนว่านี้:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg
สมมติว่าฉันได้zip
ติดตั้ง:
sudo apt-get install zip
ฉันเห็นจากman zip
ที่อนุญาตให้ฉันใช้รายการไฟล์:
- รายชื่อไฟล์ @ หากระบุรายการไฟล์เป็น - @ [ไม่ใช่ใน MacOS] zip จะใช้รายการของไฟล์อินพุตจากอินพุตมาตรฐานแทนจากบรรทัดคำสั่ง ตัวอย่างเช่น,
zip -@ foo
ดังนั้นฉันสร้างzip.lst
ที่มีลักษณะเช่นนี้:
cat zip.lst
file1.txt
file2.txt
file3.txt
file.jpg
test.jpg
และตอนนี้ฉันพยายาม:
zip -@ zip.lst
แต่มันไม่ได้ทำอะไรนอกจากสร้างบรรทัดว่างบนคอนโซล และฉันสามารถผลักEnterมันได้เรื่อย ๆ และมันก็แค่สร้างบรรทัดว่างขึ้นเรื่อย ๆ โดยไม่ต้องใช้คำสั่ง หลังจากการค้นหาบางอย่างฉันก็รู้ว่าฉันต้องยุติการป้อนข้อมูลด้วยการกดCtrl+D
แต่ตอนนี้ฉันได้รับข้อผิดพลาดนี้:
zip warning: missing end signature--probably not a zip file (did you
zip warning: remember to use binary mode when you transferred it?)
zip warning: (if you are trying to read a damaged archive try -F)
zip error: Zip file structure invalid (zip.lst)
อะไร!? รายการแบบง่ายของฉันไม่ใช่ "โครงสร้างไฟล์ที่ถูกต้อง" อย่างไร กลับไปที่คู่มือสำหรับข้อมูลเพิ่มเติมและฉันลองดู:
หากระบุรายการไฟล์เป็น - @ ...
ดังนั้นผมจึงลองได้โดยไม่ต้อง-@
และที่ไปที่กระบวนการอย่างน้อยได้ทันทีโดยไม่ต้องกดCtrl+ Dแต่ฉันทิ้งให้อยู่กับข้อผิดพลาดเดียวกัน
โชคดีที่ฉันพบความคิดเห็นเกี่ยวกับคำตอบของคำถามที่ไม่เกี่ยวข้องซึ่งทำให้ฉันรู้ว่าฉันต้องการตั้งชื่อไฟล์ zip อย่างชัดเจน error'd zip.lst
นี้เพราะโดยค่าเริ่มต้นมันก็พยายามที่จะสร้างไฟล์ซิปที่เรียกว่า แต่เนื่องจากเป็นชื่อของรายการของฉันหนึ่งอาจคิดว่ามันจะเขียนทับมัน แต่ไม่ใช่ในความเป็นจริงพยายามอัปเดต และเนื่องจากรายการไม่ใช่ไฟล์ zip เราจึงได้รับข้อผิดพลาดของโครงสร้างไฟล์ที่ไม่ถูกต้องและตอนนี้ก็ชัดเจนว่าทำไมมันถึงพูดว่า "อาจไม่ใช่ไฟล์ zip" ดังนั้นฉันจึงลอง:
zip files.zip zip.lst
adding: zip.lst (deflated 35%)
ยูเรก้า! ฉันเห็นไฟล์ซิปถูกสร้างขึ้นและตอนนี้โฟลเดอร์ของฉันมีสิ่งนี้:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst
แต่รอก่อนที่เราจะฉลองกันเถอะยืนยันเนื้อหาของไฟล์ zip ก่อน:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
48 2016-05-24 15:30 zip.lst
--------- -------
48 1 file
No! ที่จริงแล้วมันสมเหตุสมผลจากการใช้งานมาตรฐานเพราะมันแค่ซิปลิสต์ไฟล์เดียวที่ฉันให้ไว้ ในที่สุดฉันก็ลองอีกครั้ง-@
แต่ได้ผลลัพธ์เหมือนกัน
ผมทำอะไรผิดหรือเปล่า?
BTW ฉันรู้ว่าฉันสามารถใช้ GUI และทำได้ด้วยเมาส์ของฉัน แต่ฉันต้องเขียนสคริปต์นี้และโดยทั่วไปฉันจะใช้ CLI เร็วขึ้นเมื่อฉันรู้ว่าฉันกำลังทำอะไรอยู่
ls
และgrep
และไปรษณีย์ของ-@
คุณสามารถใช้ globs เปลือกเพื่อเลือกไฟล์โดยตรงในบรรทัดคำสั่งเช่นซิปหรือzip files.zip file*
zip images.zip *.jpg
นอกจากนี้เมื่อใช้รายชื่อไฟล์จากไฟล์คุณสามารถใช้การเปลี่ยนเส้นทางแทนการเรียกกระบวนการแมวแยกต่างหากzip files.zip -@ < zip.lst