ฉันจะสร้างไฟล์เก็บถาวร zip ของทั้งไดเรกทอรีผ่านทางเทอร์มินัลโดยไม่มีไฟล์ที่ซ่อนอยู่ได้อย่างไร


220

ฉันมีโครงการที่มีโฟลเดอร์ / ไฟล์ที่ซ่อนอยู่มากมาย ฉันต้องการสร้าง zip-archive ของมัน แต่ในไฟล์เก็บถาวรไม่ควรเป็นโฟลเดอร์ / ไฟล์ใด ๆ หากไฟล์ในโฟลเดอร์ที่ซ่อนไม่ถูกซ่อนไว้ไฟล์เหล่านั้นก็ไม่ควรถูกรวมไว้ด้วย

ฉันรู้ว่าฉันสามารถสร้างไฟล์ zip ของไดเรกทอรีเช่นนี้

zip -r zipfile.zip directory

ฉันรู้ด้วยว่าฉันสามารถยกเว้นไฟล์ด้วยตัวเลือก -x ดังนั้นฉันคิดว่านี่อาจเป็นไปได้:

zip -r zipfile.zip directory -x .*

มันไม่ทำงาน ไดเรกทอรีที่ซ่อนอยู่ทั้งหมดยังคงอยู่ในไฟล์ zip

คำตอบ:


107

สิ่งนี้ยังแยกไฟล์ที่ซ่อนอยู่ในไดเรกทอรีที่ไม่ได้ซ่อน:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@

2
ขอบคุณสำหรับคำตอบ. คำสั่ง ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) ยาวกว่าที่คาดหมาย แต่ใช้งานได้ดี ไดเรกทอรีย่อยรวมอยู่ด้วยดังนั้น +1 และคำตอบที่ได้รับการยอมรับ :-)
มาร์ตินโทมา

104

ก่อนอื่นถ้าคุณยังไม่ได้ติดตั้ง zip ให้ติดตั้งก่อนดังนี้:

sudo apt-get install zip

จากนั้นเพียงสร้างไฟล์ zip:

zip -r compressed_filename.zip foldername

หากคุณต้องการยกเว้นไฟล์ที่ซ่อนอยู่:

find /folder_path -path '*/.*' -prune -o -type f -print | zip ~/compressed_filename.zip -@

การยกเว้นไฟล์จากไฟล์เก็บถาวร Zip (นำมาจากhttp://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

พื้นฐานของการแยกไฟล์เมื่อสร้างไฟล์ zip นั้นจะอยู่กึ่งกลางรอบ-xแฟล็กซึ่งใช้เพื่อแยกไฟล์ออกจากไฟล์เก็บถาวรที่ตรงกับชื่อหรือรูปแบบเฉพาะ ที่พื้นฐานที่สุดแล้วจะมีลักษณะเช่นนี้:

zip archive.zip files -x "ExcludeMe"

หมายความว่าคุณสามารถยกเว้นไฟล์เดียวได้โปรดบอกว่ามันมีชื่อว่า“ Nothanks.jpg”

zip archive.zip images/ -x "Nothanks.jpg"

เรามาดูตัวอย่างที่มีประโยชน์

ไม่รวมไฟล์. DS_Store จาก Zip Archives

วิธีนี้จะป้องกันไม่ให้.DS_Store ไฟล์เมทาดาทาของ Mac ที่มองไม่เห็นโดยทั่วไปถูกรวมอยู่ในไฟล์ zip ซึ่งรวมอยู่ในค่าเริ่มต้น:

zip -r archivename.zip archivedirectory -x "*.DS_Store"

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

zip -r archive.zip directory -x "*/\.DS_Store"

หมายเหตุ: เชลล์บางตัวไม่จำเป็นต้องมีใบเสนอราคาสำหรับคำสั่งนี้เพื่อให้ทำงานได้อย่างถูกต้อง แต่ใน bash shell (ค่าเริ่มต้นสำหรับ OS X) คุณจะต้องใช้เครื่องหมายคำพูดเพื่อยกเว้นด้วย wildcard และรูปแบบ

ยกเว้นประเภทไฟล์เฉพาะจากไฟล์ Zip

ด้วย wildcard คุณสามารถยกเว้นไฟล์บางประเภททั้งหมดโดยเน้นที่ส่วนขยาย ตัวอย่างเช่นคำสั่งนี้จะซิปทั้งไดเรกทอรีลบ.jpgไฟล์ใด ๆ:

zip -r archive.zip directory -x "*.jpg"

ที่สามารถแก้ไขได้สำหรับนามสกุลไฟล์หรือรูปแบบเฉพาะที่ตรงกับชื่อไฟล์

แยกไดเรกทอรี. git หรือ. svn ออกจาก Zip Archive

ซิปไดเรกทอรีลบ.gitและเนื้อหาของมัน:

zip -r zipdir.zip directorytozip -x "*.git*"

ซิปโฟลเดอร์โดยไม่รวม.svnไดเรกทอรี:

zip -r zipped.zip directory -x "*.svn*"

ไม่รวมไฟล์ที่ซ่อนทั้งหมดจากไฟล์ Zip

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

zip -r archivename.zip directorytozip -x "*.*"

หรือเพื่อแยกไฟล์ที่มองไม่เห็นทั้งหมดออกจากไดเรกทอรีย่อยทั้งหมด:

zip -r archive.zip directory -x "*/\.*"

5
ขอบคุณสำหรับความพยายามในการช่วยเหลือเพื่อนผู้ใช้ Ubuntu โปรดทราบว่าการระบุคำตอบที่ยอมรับใหม่ในคำตอบใหม่จะเพิ่มความยุ่งเหยิงและมีโอกาสสูงที่จะถูกตั้งค่าสถานะเพื่อนำออก
hmayag

54

เพิ่ม"ไปที่.*(มิฉะนั้นเชลล์ของคุณจะขยาย.*ไปยังไฟล์ dot ในไดเรกทอรีปัจจุบัน) และยังไม่รวมไฟล์ที่ซ่อนอยู่ในไดเรกทอรีย่อย:

zip -r zipfile.zip . -x ".*" -x "*/.*"

ซึ่งจะส่งผลให้ไฟล์เริ่มต้นด้วย.ไม่ต้องเพิ่มลงในไฟล์ zip ของคุณ

rinzwind@discworld:~/tmp$ ls -la
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 tmp
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 .tmp
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x .*
adding: .tmp/ (stored 0%)
adding: tmp/ (stored 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
updating: tmp/ (stored 0%)

1
ฉันไม่คิดว่าคำสั่งสุดท้ายของคุณถูกต้อง .*จะได้รับการขยายตัวโดยเปลือก
ไวยากรณ์

1
ผมคิดว่ามันมีโอกาสที่จะถูกต้อง แต่ผมหยิบมันออกมา (ไม่แน่ใจเกี่ยวกับมัน) :)
Rinzwind

สิ่งนี้ไม่ทำงาน ไดเรกทอรี. svn ถูกเพิ่มเข้ามา
Martin Thoma

1
@moose รูปแบบการยกเว้นตรงกับพา ธ เต็มไม่ใช่แค่ชื่อไฟล์ดังนั้นคุณต้องยกเว้น*/.*เช่นเดียวกับ.*( */ตรงกับลำดับของไดเรกทอรีที่ไม่ว่าง)
Gilles

สิ่งนี้จะทำงานโดยไม่เปลี่ยนอะไรเลย! คำตอบที่ดีที่สุด
Whitecat

8

อันนี้รวมทั้งหมด "." ไดเรกทอรีไดเรกทอรีย่อยและ "." ไฟล์หรือไดเรกทอรีภายในไดเรกทอรี ... เป็นคำตอบแรก แต่รวมถึงระดับสูงสุด "." ไฟล์

find /full_path -path '*.*/.*' -prune -o -type f -print | zip ~/file.zip -@

8

ตัวอย่างการยกเว้นโฟลเดอร์ทั้งหมดที่เริ่มด้วย :

tar cvpzf folder.tgz folder/ --exclude '.*'

บีบอัดได้ดีขึ้น แต่ช้าลง:

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'

5

วิธีการที่ถูกต้องจะเป็น:

zip -r zipfile.zip directory -x directory/.*

@downvoter: มีอะไรผิดปกตินี่ดูเหมือนจะใช้ได้กับฉัน
jobin

ปัญหาเช่นเดียวกับคำตอบดั้งเดิมของ Rinzwind (แก้ไขแล้วตอนนี้): คุณไม่ได้ยกเว้นไดเรกทอรีย่อย และตามที่ Rinzwind ตั้งไว้คุณจะต้องอ้างถึงสัญลักษณ์แทนมิฉะนั้นเชลล์จะขยายออก
Gilles

4

ในขณะที่ zipping dirs ไม่รวมนามสกุลไฟล์บางส่วน:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"

3

ไม่มีโฟลเดอร์และไฟล์ที่ซ่อนอยู่ในไดเรกทอรี:

zip -r zipfile.zip directory/*

ไดเรกทอรี: |── .git │   ├── src │   └── Work.file ├── .test │   └── .file └── test.file

$ zip -r zipfile.zip directory/*
adding: directory/src/ (stored 0%)
adding: directory/src/Work.file (stored 0%)
adding: directory/test.file (stored 0%)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.