__MACOSX klasörü olmadan Mac zip sıkıştırması?


158

Mac OSX'te yerleşik zip kompresörüyle dosyaları sıkıştırdığımda, çıkarılan zip'de oluşturulan "__MACOSX" başlıklı ekstra bir klasör ortaya çıkar.

Bu klasörün oluşturulmasını önlemek için ayarlarımı ayarlayabilir miyim veya üçüncü taraf bir sıkıştırma aracı satın almam gerekir mi?

GÜNCELLEME : Ben sadece OSX için sorunumu çözen ücretsiz bir uygulama buldum: " YemuZip "

GÜNCELLEME 2 : YemuZip artık ücretsiz değil


_MACOSX klasörünün varlığı herhangi bir sorun yaratmaz. Basitçe silin.
Jayprakash Dubey

1
Bu soru konu dışı gibi görünüyor çünkü AskDifferent
Nakilon'da

11
Bozulmamış bir zip arşivi gerektiren seçici web hizmetleriyle ilgili bir sorun yaratıyor, bu yüzden açıklamalar için minnettarım
mccc

21
Bu var @JayprakashDubey incredibily rahatsız edici ve gittiğim her yerde çöp bırakmıyorum seven bir linux kullanıcısı olarak, ben duramaz __MACOSX, .DS_Store, ._fileName, ve diğer tüm çeşit çeşit turds Mac OS arşivlerinde düşer. OSX'in `` katranı '' da bunu yapıyor - en az şaşkınlık ilkesine açıkça göz ardı ediyor .
Wyatt8740

Yanıtlar:


80

Bu sorunu yaşadığımda komut satırından yaptım:

zip file.zip uncompressed

EDIT , birçok downvotes sonra: Bir süre önce bu seçeneği kullanıyordum ve nerede öğrendiğimi bilmiyorum, bu yüzden size daha iyi bir açıklama veremem. Chris Johnson'un cevabı doğru, ama benimkini silmeyeceğim. Bir yorumun söylediği gibi, OP'nin sorduğu şey daha doğrudur, çünkü sıkıştırılmış bir dosyadan kaldırmak yerine bu dosyalar olmadan sıkıştırır. Ben de hatırlamayı daha kolay buluyorum.


33
Bunun açıklaması yok.
Raptor

2
__MACOSX / alt dizini Mac kaynak çatallarını içerir ve zip dosyasını oluşturmak için Mac araçlarını kullandığınızda oluşturulur. Benzer şekilde, Mac araçları kaynak çatallarını ayarlamak için __MACOSX / alt dizinini tüketir ve asla görmezsiniz. Ancak, zip dosyasını oluşturmak için Mac araçlarını ve paketini açmak için başka araçları kullanırsanız, kaynak çatallarını değil __MACOSX / dizinini alırsınız. zip3. taraf bir uygulama olan bir dosya oluşturursanız, __MACOSX / dizini asla ilk etapta oluşturulmaz.
Edward Falk

Zip dosyası oluşturulduktan sonra _MACOSX klasörünü silmenin kolay bir yolu için cevabıma bakın.
Chris Johnson

3
__MACOSX ve diğerleri olmadan bir dizini yinelemeli olarak sıkıştırmak için:zip -rX file.zip uncompressed_directory
Konstantin Suvorov

319

Aslında bundan sonra sabitlenebilir zip -d filename.zip __MACOSX/\*


51
.DS_Store dosyalarını da silmek için:zip -d filename.zip \*/.DS_Store
Benedikt Köppel

5
Kabul edilen cevap, __MACOSX / dizinini ilk etapta nasıl elde edemeyeceğinizi, ancak mevcut bir .zip dosyasıyla ne yapılacağı hakkında hiçbir şey söylemiyor. Bu cevap __MACOSX'tan nasıl kurtulacağınızı söylüyor. Ancak, asıl soru ilk etapta nasıl elde edilemeyeceğiydi, bu yüzden kabul edilen cevap doğru cevaptır.
Edward Falk

Bunu tüm zip dosyaları için yinelemeli olarak nasıl yapabilirim?
Wowfunhappy

Bazı kökün altındaki tüm zip dosyalarına uygulamak için: find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. İçin başlangıç ​​noktanızı değiştirin ~.
Chris Johnson

Bir fonksiyon tüm gereksiz dosyaları kaldırmak için: cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }. Kullanım: cleanzip file.zipveya cleanzip file.zip MORE_JUNK_FILES(ikinci parametre isteğe bağlıdır)
mrdaliri

57

Sıkıştırmak istediğiniz klasörün içinde, terminalde:

zip -r -X Archive.zip *

-X nerede: “_MACOSX” veya “._ Dosyaadı” gibi görünmez Mac kaynak dosyalarını ve .ds saklama dosyalarını hariç tutun

kaynak

Not: Yalnızca içinde bulunduğunuz klasör ve sonraki klasör ağacı için çalışır ve *joker karaktere sahip olmak zorundadır .


9
Bu, düşündüğünüz gibi çalışmaz: -X.DS_Store dosyalarını hariç tutmaz. Uygulamanız için çalışabilmesinin nedeni, yalnızca *"." İle başlamayan dosyalarla eşleşen bir joker karakterdir. Nokta dosyası içeren bir dizinde deneyin ve dahil edildiğini göreceksiniz.
spinup

Zip dosyası oluşturulduktan sonra _MACOSX klasörünü silmenin kolay bir yolu için cevabıma bakın.
Chris Johnson

1
Hayır zip -r -X Archive.zip myfolder. Bir klasörde hala .DS_Store dosyası içeren bir zip dosyası oluşur.
Rockallite

@Rockallite: Bu, yalnızca içinde bulunduğunuz klasördeki klasörleri, ağacı veya dosyaları sıkıştırdığınızda çalışacaksınız. Dolayısıyla, bir klasörü bağımsız değişken olarak geçiremezsiniz veya beklendiği gibi çalışmaz, yalnızca * joker karakteriyle işe yarıyor.
pompalini

Bu, tam bir klasörü sıkıştırmak yerine dizinlerdeki dosyalar için çalışır.
Michael Trouw

26

Bu komut benim için yaptı:

zip -r Target.zip Source -x "*.DS_Store"

Target.zipoluşturulacak zip dosyasıdır. Sourcesıkıştırılacak kaynak dosya / klasördür. Ve _xparametre eklenmeyecek dosyayı / klasörü belirtir. Yukarıdaki herhangi bir nedenle işe yaramazsa, bunun yerine şunu deneyin:

zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"

OP __MACOSX klasörünün nasıl hariç tutulacağını sordu. İlk kod snippet'iniz açıkça işe yaramaz, çünkü bunu hariç tutulacak bir klasör olarak adlandırmaz.
Chris Johnson

7
zipKomut satırı yardımcı programı bir oluşturur asla __MACOSXdizini, bu nedenle ilk pasajı çalışır ve -x "__MACOSX"bölüm gerekli değildir.
nisetama

15

Sonra düzeltmek için bu Automator Shell Script kullanıyorum. Bağlamsal menü öğesi olarak görünür (Finder'da gösterilen herhangi bir dosyaya sağ tıklayarak).

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. Automator ile yeni bir Servis oluşturun
  2. "Finder" da "Dosyalar ve Klasörler" i seçin
  3. "Kabuk Betiği Eylemi" ekleme

automator kabuk betiği

Finder'daki bağlamsal menü öğesi


Sıkıştırmayı Apple yerleşik kullanarak sıkıştırmak yerine Automator Shell Script'te zip kullanarak yapmak daha iyi olmaz mı?
Matt

@Matt arşivleme adımını automator'a ekleyebilir veya başka bir shell komutu da kullanabilirsiniz.
ttimasdf

@Matt ayrıca, Apple yerleşik dosya olduğunda otomatik dosya adlandırma ve ad artışını yönetir. Kabuk betiği ile bu kısım çok iş olurdu.
ttimasdf

1
Arşivde .DS_Store klasörü yoksa bir hata atar. `|| || her zip komutundan sonra true` ( zip -d "$p" __MACOSX/\* || truecevabınıza gibi.
adamsfamily

1
Diğer cevaplar iyi olsa da, bunu en çok sevdim çünkü çok Macish bir şekilde kullanılabilir.
not2savvy

10

İstenmeyen klasörler aşağıdaki yollarla da silinebilir:

zip -d filename.zip "__MACOSX*"

Benim için en iyisi


8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": bahsettiğiniz gibi __MACOSX'u görmezden gelin.
  • -x "*/\.*": .DS_Store gibi gizli dosyaları yoksay.
  • SPACE ile adlandırılmışsa, dosyayı önlemek için değişkeni alıntılayın.

Ayrıca, Finder'da kolayca kullanmak için Automator Hizmeti oluşturabilirsiniz. İhtiyacınız olursa ayrıntıları görmek için aşağıdaki bağlantıyı kontrol edin.

Github


Bir çöp denizi arasında tek doğru cevap olan Heh de en az oyu alan oyundur. sigh
Heath Raftery

Benim için çalıştı ama destFileName.zip ve srcFileName
Alexander Poleschuk

3

zipKomut satırı yardımcı programı bir oluşturur asla __MACOSXsadece böyle bir komutu çalıştırmak, böylece dizin:

zip directory.zip -x \*.DS_Store -r directory

Aşağıdaki çıktıda a.zip, zipkomut satırı yardımcı programı ile oluşturduğum bir __MACOSXdizin içermiyor , ancak a 2.zipFinder'dan oluşturduğum dizin var.

$ touch a
$ xattr -w somekey somevalue a
$ zip a.zip a
  adding: a (stored 0%)
$ unzip -l a.zip
Archive:  a.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-02-16 20:29   a
 --------                   -------
        0                   1 file
$ unzip -l a\ 2.zip # I created `a 2.zip` from Finder before this
Archive:  a 2.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-02-16 20:29   a
        0  01-02-16 20:31   __MACOSX/
      149  01-02-16 20:29   __MACOSX/._a
 --------                   -------
      149                   3 files

-x .DS_Store.DS_Storedizinlerin içindeki dosyaları hariç -x \*.DS_Storetutmaz, ancak .

Değilse, çünkü (gibi birden fazla dosya ile bir zip arşivinin üst düzey dosyası genellikle bazı unarchiving Utilites, tek bir dizin olmalıdır unzipve 7zancak Arşiv Programı, Unarchiver, unarya dtrx) için içeren bir dizin oluşturmaz arşiv çıkarıldığında dosyaları bulur, bu da dosyaların bulunmasını zorlaştırır ve aynı anda birden fazla arşiv çıkarılırsa, hangi dosyaların hangi arşive ait olduğunu söylemek zor olabilir.

Arşiv Yardımcı Programı yalnızca, __MACOSXen az bir dosyanın genişletilmiş öznitelikler, dosya bayrakları veya kaynak çatalı gibi meta veriler içerdiği bir arşiv oluşturduğunuzda dizin oluşturur . __MACOSXDizin kimin dosya adı başlar ile AppleDouble dosyaları içeren ._bu OS X özgü meta verileri depolamak için kullanılır. zipKomut satırı yardımcı programı atar meta böyle bir takma dosyasındaki bilgiler kaynak çatalı saklanır çünkü meta gibi etiketler kaybolur ve bu takma adlar durmasına olması da araçlar uzantı nitelikleri, dosya bayrakları ve kaynak çatal gibi.

Normalde OS X'e özgü meta verileri atabilirsiniz, ancak hangi meta veri dosyalarının içerdiğini görmek için kullanabilirsiniz xattr -l. xattrkaynak çatalları ve dosya bayrakları da içerir; Hem Arşiv Yardımcı Programı hem de zipkomut satırı yardımcı programı ACL'leri atar.


Bu yalnızca dizinler için geçerlidir, dizin içindeki bir grup dosya için geçerli değildir.
Michael Trouw

@MichaelTrouw Evet, ancak genellikle en üst düzeyde birden fazla dosya içeren bir arşiv oluşturmamalısınız.
nisetama

Katılmayı kabul ediyorum, çünkü bunun iyi olduğu kullanım durumları var. Örneğin, bir zip dosyasının son kullanıcısı hiçbir zaman kullanıcı olmayacaktır. Ama bir sunucu.
Michael Trouw

3

Yapamazsın.

Ancak yapabileceğiniz şey, sıkıştırıldıktan sonra istenmeyen klasörleri silmek. Komut satırı , bir ifadenin içeriği normal ifadeye göre silmek için zipolduğu gibi farklı argümanlar alır -d. Böylece şu şekilde kullanabilirsiniz:

zip -d filename.zip __MACOSX/\*

2

hiçbir gizli dosyayı zipleme:

zip newzipname filename.any  -x "\.*"

bu soru ile şöyle olmalı:

zip newzipname filename.any  -x "\__MACOSX"

Bununla birlikte, zip komutu sadece dosyayı sıkıştıran terminalde çalışır, başkalarını sıkıştırmaz. Yani sonuç aynı mı?

zip newzipname filename.any

__MACOSXile başlamıyor.
PJMeisch

evet, bir hata yaptım. Değiştirildi. Hatırlattığınız için teşekkürler
Xian Shu

1

zipKomut satırı aracını mı yoksa Finder'ın Sıkıştır komutunu mu kastediyorsunuz ?

İçin seçeneği zipdeneyebilirsiniz --data-fork. Bunu yapmazsa --no-extra, uid / gid ve dosya zamanları gibi değerli olabilecek diğer dosya meta verilerini yoksaymış gibi görünse de deneyebilirsiniz .

Finder'ın Sıkıştır komutu için, davranışını kontrol etmek için herhangi bir seçenek olduğuna inanmıyorum. Basit dava için.

Diğer araç ve belki de Finder'ın aslında kaputun altında kullandığı araç ditto. İle -c -kseçenekleri, bu zip arşivler oluşturur. Bu araç ile, deneyebilirsiniz --norsrc, --noextattr, --noqtn, --noaclve / veya basitçe atlanıp --sequesterRsrc(adam sayfasına göre, sorumlu olabilir seçeneği __MACOSXalt dizini). Her ne kadar, belki de yokluğu --sequesterRsrcsadece bir __MACOSXdizin yerine her yerde ._ dosyaları oluşturacak AppleDouble formatını kullanmak anlamına gelir .


1
Evet, bulucunun "Sıkıştır" yardımcı programından bahsediyorum. Olduğu gibi, WordPress'in görünümünü / düzenleyicisini berbat eden ._ dosyalarıyla dolu bir klasör alıyorum
Scott B

1

Var olan tüm cevapları okuduktan sonra daha iyi bir çözümüm var. Her şey bir iş akışı ile tek bir sağ tıklamayla yapılabilir. NO ek yazılım, NO komut satırı maddeleri ve karmaşık YOK kabuğu incelikleri.

Otomatikleştirici iş akışı:

  • Girdi: herhangi bir uygulamadaki dosyalar veya klasörler.
  • Adım 1: Sistem, varsayılan parametrelerle yerleşik olan Arşivi oluşturun.
  • Adım 2: Shell komutunu parametre olarak girdi ile çalıştırın. Aşağıdaki kopyalama komutu.

    zip -d "$@" "__MACOSX/*" || true

    zip -d "$@" "*/.DS_Store" || true

Kaydet ve biz bitti! Klasörü veya dosya yığınını sağ tıklayın ve hizmetler menüsünden iş akışını seçin. Yanında meta veri içermeyen arşiv oluşturulacak.

Örneklem


0

Komut __MACOSXile dosyaları sıkıştırırken dizinden nasıl kaçınırım tar:

$ cd dir-you-want-to-archive $ find . | xargs xattr -l # <- list all files with special xattr attributes ... ./conf/clamav: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55 ./conf/global: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55 ./conf/web_server: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55

İlk olarak özelliği silin:

find . | xargs xattr -d com.apple.quarantine

find . | xargs xattr -lTekrar çalıştırın , hiçbir dosyanın xattr özniteliğine sahip olmadığından emin olun. o zaman gitmek iyidir:

tar cjvf file.tar.bz2 dir

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.