Bir dizinin tamamında gizli dosyalar olmadan bir zip arşivini nasıl oluşturabilirim?


220

Çok sayıda gizli klasör / dosya içeren bir projem var. Bir zip arşivi oluşturmak istiyorum, ancak arşivde hiçbir gizli klasör / dosya olmamalıdır. Gizli bir klasördeki dosyalar gizli değilse, eklenmemeleri gerekir.

Bunun gibi bir dizinin zip arşivini oluşturabileceğimi biliyorum:

zip -r zipfile.zip directory

Ayrıca -x seçeneğiyle dosyaları dışlayabileceğimi de biliyorum, bu yüzden bunun işe yarayabileceğini düşündüm:

zip -r zipfile.zip directory -x .*

İşe yaramadı. Tüm gizli dizinler hala zip dosyasındaydı.

Yanıtlar:


107

Bu aynı zamanda yasak dizinlerdeki gizli dosyaları da hariç tutar:

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

2
Cevabınız için teşekkürler. Command ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) beklenenden daha uzun, ancak iyi çalışıyor. Alt dizinler de dahil edilmiştir, yani +1 ve kabul edilen bir cevap :-)
Martin Thoma

104

Öncelikle, zip'i kurmadıysanız, ilk önce aşağıdaki şekilde kurun:

sudo apt-get install zip

Sonra sadece bir zip dosyası oluşturmak için:

zip -r compressed_filename.zip foldername

Gizli dosyaları hariç tutmak istiyorsanız:

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

Zip Arşivindeki Dosyaları Hariç Tutmak ( http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ adresinden alınmıştır )

Bir zip arşivi oluştururken dosya dışlamanın temelleri, -xbelirli bir ad veya desenle eşleşen dosyaları arşivden çıkarmak için kullanılan bayrak çevresinde ortalanır . En temelde şöyle görünecek:

zip archive.zip files -x "ExcludeMe"

Tek bir dosyayı hariç tutabileceğiniz anlamına gelir, “Nothanks.jpg” olarak adlandırılır.

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

Bunun yararlı olduğu birkaç spesifik örneği ele alalım.

.DS_Store Dosyalarını Zip Arşivlerinden Çıkar

Bu, tipik olarak görünmeyen Mac meta veri .DS_Store dosyalarının, varsayılan olarak paketlenmiş olan bir zip arşivine eklenmesini önler :

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

Bununla birlikte, dizin alt dizinler içeriyorsa, ds_store dosyalarını alt dizinlerden çıkarmak için bu komutun başka bir varyasyonunu kullanmak istersiniz:

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

Not: Tüm kabuklar bu komutun alıntılarının düzgün çalışmasını gerektirmez, ancak bash kabuğunda (OS X için varsayılan) joker karakterleri ve desenleri hariç tutmak için tırnak işaretleri kullanmanız gerekir.

Bir Zip Arşivinden Belirli Dosya Türlerini Hariç Tut

Joker karakterlerle, uzantıya odaklanarak belirli bir türdeki tüm dosyaları dışlayabilirsiniz. Örneğin, bu komut eksi herhangi bir .jpgdosyayı ekleyerek bütün bir dizini sıkıştırır :

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

Bu, bir dosya adında eşleşen herhangi bir belirli dosya uzantısı veya deseni için değiştirilebilir.

.Git veya .svn Dizini bir Zip Arşivinden hariç tut

Bir dizini sıkıştırın, eksi .gitve içeriği:

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

.svnDizini eklemeksizin bir klasörü sıkıştırın:

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

Tüm Gizli Dosyaları Zip Arşivinden Çıkar

Desen ve joker kullanılabilir olduğundan, ayrıca böyle bir dizin olsun, bir süre öneki olan bunu yapılır herhangi bir veya tüm görünmez dosya ve klasörleri hariç olabilir .svnveya benzeri bir tek dosya .bash_profileveya .htaccess.

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

Veya tüm görünmez dosyaları tüm alt dizinlerden çıkarmak için:

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

5
Bir Ubuntu kullanıcısına yardım etmek için gösterdiğiniz çaba için teşekkür ederiz. Lütfen kabul edilen cevabı yeni bir cevapta tekrar belirtmenin sadece karışıklığa yol açtığını ve çıkarılması için işaretlenme olasılığının yüksek olduğunu unutmayın.
hmayag

54

Ekle "için .*(aksi takdirde kabuk genişletir .*alt dizinleri gizli dosyaları geçerli dizinde nokta dosyalarına) ve aynı zamanda dışlamak:

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

Bu, .zip dosyanıza eklenmemesi ile başlayan dosyaların ortaya çıkmasına neden olacaktır.

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
Son ifadenin doğru olduğunu sanmıyorum. .*kabuk tarafından genişleyecekti.
Hammar

1
Doğru olması muhtemel olduğunu düşünüyorum ama kaldırdım (bundan emin değilim) :)
Rinzwind

bu işe yaramadı. .Svn dizinleri eklendi
Martin Thoma

1
Hariç tutmak gerekir böylece, desen tam yolunu değil, sadece dosya taban adı maçları hariç @moose */.*yanı sıra .*( */dizinlerinin herhangi boş olmayan diziyi eşleşir).
Gilles,

Bu hiçbir şeyi değiştirmeden çalışır! En iyi cevap.
Whitecat

8

Bu, hepsini "" içerir. dizinler, alt dizinler ve "." dizinler içindeki dosyalar veya dizinler ... Esas olarak ilk cevap, ancak "." Dosyalar.

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

8

Başlangıçtaki tüm klasörleri hariç tutmak için örnek. :

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

Daha iyi sıkıştırma ancak daha yavaş:

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

5

Doğru yöntem şudur:

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

@ downvoter: Sorun nedir, bu benim için çalışıyor gibi görünüyor.
jobin

Rinzwind'in orijinal cevabı ile aynı problem (şimdi düzeltildi): alt dizinleri dışlamıyorsunuz . Ve Rinzwind'in belirttiği gibi, joker karakterleri alıntılamanız gerekir, aksi takdirde kabuk onları genişletir.
Gilles,

4

Bazı dosya uzantıları hariç dizleri sıkıştırırken:

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

3

Dizindeki gizli klasörler ve dosyalar olmadan:

zip -r zipfile.zip directory/*

dizin: |── .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%)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.