หลีกเลี่ยงเส้นทางที่ไม่ต้องการในไฟล์ซิป


49

ฉันทำเชลล์สคริปต์เพื่อทำแพคเกจไฟล์บางไฟล์ ฉันกำลังซิปไดเรกทอรีเช่นนี้:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

ปัญหาคือไฟล์เก็บถาวร out.zip มีเส้นทางไฟล์ทั้งหมดในนั้น นั่นคือเมื่อคลายซิปไฟล์มันจะมีเส้นทาง "/ Users / me / development / anotherthing /" ทั้งหมดอยู่ในนั้น เป็นไปได้หรือไม่ที่จะหลีกเลี่ยงพา ธ ที่ลึกเหล่านี้เมื่อใส่ไดเร็กตอรี่ในไฟล์เก็บถาวร

เมื่อฉันเรียกใช้ zip จากภายในไดเรกทอรีเป้าหมายฉันไม่มีปัญหานี้

zip -r out.zip ./folder/

ในกรณีนี้ฉันไม่ได้รับขยะทั้งหมด อย่างไรก็ตามสคริปต์ที่สงสัยจะถูกเรียกจากที่ใดก็ได้

FWIW ฉันใช้ทุบตีบน Mac OS X 10.6

คำตอบ:


85

สคริปต์ของคุณควรใช้cdหรือpushdและpopdเพื่อย้ายไปยังไดเรกทอรีที่จะเป็นรูทของไฟล์เก็บถาวรก่อนที่จะออกzipคำสั่ง วิธีที่คุณทำเช่นนี้จะขึ้นอยู่กับว่าสคริปต์รู้ว่าจะ zip อะไร แต่ถ้าคุณต้องการ/ ผู้ใช้ / ME / พัฒนา / สิ่งที่ / โฟลเดอร์ซิปที่มีเส้นทางภายในเพียง./folderคุณจะต้องทำเช่นนี้:

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

ที่จะส่งผลให้คุณout.zipมีเส้นทางสัมพันธ์ที่คุณต้องการ

หากคุณต้องการความช่วยเหลือเกี่ยวกับการเขียนสคริปต์คุณจะต้องแสดงสคริปต์ของคุณให้เราทราบ


8
ไม่มีปัญหา. ฉันทำเช่นนี้ในหนึ่งสมุทรบน commandline ตลอดเวลาเช่น: $ pushd /some/path ; do-something ; popd... หรือแม้กระทั่งกับ subshells:$ ( cd /some/path ; do-something )
ต้มตุ๋น Quixote

1
@ ~ quack: +1 โดยเฉพาะอย่างยิ่งสำหรับเทคนิค sub-shell ในความคิดเห็น
Jonathan Leffler

1
แม้ว่าจะใช้&&แทน;เป็นความคิดที่ดีเพื่อให้คำสั่งอื่น ๆ ไม่ทำงานถ้าcdล้มเหลว (พิมพ์ผิดหรือมีปัญหาอื่น ๆ ):(cd /some/path && do-something)
คริสจอห์นสัน

3
ไม่มีวิธีการทำเช่นนี้หากไม่ระบุพา ธ สัมบูรณ์สำหรับไฟล์ zip หรือไม่
orange80

2
ทำไมคุณถึงเล่นเกมด้วยเส้นทาง? ทำไมไม่ใช้zip -j?
jww

5

ปัญหาคือไฟล์เก็บถาวร out.zip มีเส้นทางไฟล์ทั้งหมดในนั้น
...
เป็นไปได้หรือไม่ที่จะหลีกเลี่ยงเส้นทางที่ลึกเหล่านี้เมื่อวางไดเรกทอรีลงในไฟล์เก็บถาวร?

ใช่. ใช้ตัวเลือกด้วย-j คือ "เส้นทางขยะ" ตามหน้า man บน zip :zip-j

จัดเก็บเพียงชื่อไฟล์ที่บันทึก (ขยะพา ธ ) และอย่าเก็บชื่อไดเรกทอรี โดยค่าเริ่มต้น zip จะเก็บเส้นทางแบบเต็ม (สัมพันธ์กับไดเรกทอรีปัจจุบัน)

การใช้-jหมายถึงคำสั่งต่อไปนี้:

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

จะสร้างที่เก็บถาวรที่มีลักษณะดังนี้:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt

5
สิ่งนี้ไม่ได้ทำให้เส้นทางทั้งหมดแม้แต่ขยะแม้แต่ในไดเรกทอรี 'โฟลเดอร์' ฉันคิดว่า OP ต้องการกำจัดเส้นทางบนบรรทัดคำสั่งเท่านั้น
Peter Jaric

1
นี่อาจไม่ใช่คำตอบสำหรับคำถามนี้ แต่เป็นสิ่งที่ฉันต้องการ
Aaron McMillin

1
คำตอบนี้ไม่ถูกต้องสมมติว่าผู้ใช้ต้องการรหัสไปรษณีย์แบบแบน นี่เป็นข้อสมมติฐานที่ไม่ดีและอาจทำให้สคริปต์ล้มเหลวหากไฟล์สองไฟล์ในโฟลเดอร์ย่อยที่แตกต่างกันมีชื่อเหมือนกัน
Andrew Schwartz

1

นอกจากนี้pushdและและpopd $OLDPWDสมมติว่า$PWDมีการ/Users/me/developmentทำ:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

ตอนนี้$PWDกลับมาแล้ว/Users/me/development

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