Kompres zip Mac tanpa folder __MACOSX?

158

Ketika saya mengompres file dengan kompresor zip bawaan di Mac OSX, itu menghasilkan folder tambahan berjudul "__MACOSX" yang dibuat di zip yang diekstraksi.

Dapatkah saya menyesuaikan pengaturan saya agar folder ini tidak dibuat atau apakah saya perlu membeli alat kompresi pihak ketiga?

PEMBARUAN : Saya baru saja menemukan aplikasi freeware untuk OSX yang memecahkan masalah saya: " YemuZip "

UPDATE 2 : YemuZip tidak lagi freeware

Scott B
sumber
Keberadaan folder _MACOSX tidak menimbulkan masalah. Hapus saja.
Jayprakash Dubey
1
Pertanyaan ini tampaknya di luar topik karena seharusnya dalam AskDifferent
Nakilon
11
Ini menciptakan masalah dengan layanan web pemilih yang membutuhkan arsip zip asli, jadi saya berterima kasih atas penjelasannya
mccc
21
@JayprakashDubey Ini incredibily menjengkelkan, dan sebagai pengguna linux yang suka tidak meninggalkan sampah di mana-mana aku pergi, aku tidak tahan __MACOSX, .DS_Store, ._fileName, dan semua macam turds lainnya Mac OS tetes dalam arsipnya. `Tar 'OSX juga melakukan ini - dengan mengabaikan prinsip paling tidak mengejutkan .
Wyatt8740

Jawaban:

80

Ketika saya memiliki masalah ini, saya sudah melakukannya dari baris perintah:

zip file.zip uncompressed

EDIT , setelah banyak downvotes: Saya menggunakan opsi ini untuk beberapa waktu yang lalu dan saya tidak tahu di mana saya mempelajarinya, jadi saya tidak bisa memberi Anda penjelasan yang lebih baik. Jawaban Chris Johnson benar, tetapi saya tidak akan menghapus jawaban saya. Seperti satu komentar katakan, itu lebih akurat untuk apa yang diminta OP, karena kompres tanpa file-file itu, daripada menghapusnya dari file terkompresi. Saya juga merasa lebih mudah diingat.

sinuhepop
sumber
33
Ini kurang penjelasan.
Raptor
2
Sub direktori __MACOSX / berisi garpu sumber daya Mac dan dibuat ketika Anda menggunakan alat Mac untuk membuat file zip. Demikian juga, alat Mac akan mengkonsumsi subdirektori __MACOSX / untuk mengatur garpu sumber daya, dan Anda bahkan tidak akan pernah melihatnya. Namun, jika Anda menggunakan alat Mac untuk membuat file zip dan beberapa alat lain untuk membukanya, Anda akan mendapatkan direktori __MACOSX / dan bukan garpu sumber daya. Jika Anda membuat file dengan zip, yang merupakan aplikasi pihak ke-3, maka direktori __MACOSX / tidak pernah dibuat di tempat pertama.
Edward Falk
Lihat jawaban saya untuk cara mudah menghapus folder _MACOSX setelah file zip dibuat.
Chris Johnson
3
Untuk kompres direktori secara rekursif tanpa __MACOSX dan lainnya:zip -rX file.zip uncompressed_directory
Konstantin Suvorov
319

Dapat diperbaiki setelah fakta oleh zip -d filename.zip __MACOSX/\*

Chris Johnson
sumber
51
untuk juga menghapus file .DS_Store:zip -d filename.zip \*/.DS_Store
Benedikt Köppel
5
Jawaban yang diterima mengatakan bagaimana tidak mendapatkan direktori __MACOSX / di tempat pertama, tetapi tidak mengatakan apa-apa tentang apa yang harus dilakukan dengan file .zip yang ada. Jawaban ini mengatakan bagaimana cara menghilangkan __MACOSX / jika Anda sudah mendapatkannya. Namun, pertanyaan awal adalah bagaimana tidak mendapatkannya di tempat pertama, jadi jawaban yang diterima adalah yang benar.
Edward Falk
Bagaimana saya bisa melakukan ini secara rekursif untuk semua file zip?
Wowfunhappy
Berlaku untuk semua file zip di bawah beberapa akar: find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. Gantikan titik awal Anda untuk ~.
Chris Johnson
Sebuah fungsi untuk menghapus semua file sampah: cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }. Penggunaan: cleanzip file.zipatau cleanzip file.zip MORE_JUNK_FILES(parameter kedua adalah opsional)
mrdaliri
56

Di dalam folder yang ingin dikompres, di terminal:

zip -r -X Archive.zip *

Di mana -X berarti: Kecualikan file sumber daya Mac yang tidak terlihat seperti "_MACOSX" atau "._Filename" dan .ds menyimpan file

sumber

Catatan: Hanya akan berfungsi untuk folder dan struktur folder berikutnya tempat Anda berada dan harus memiliki *wildcard.

pompalini
sumber
9
Ini tidak berfungsi seperti yang Anda duga: -Xtidak mengecualikan file .DS_Store. Alasannya mungkin untuk aplikasi Anda adalah bahwa Anda hanya zip *, yang merupakan file pencocokan wildcard yang tidak dimulai dengan ".". Cobalah di direktori yang berisi file dot, dan Anda akan melihatnya disertakan.
spinup
Lihat jawaban saya untuk cara mudah menghapus folder _MACOSX setelah file zip dibuat.
Chris Johnson
1
Tidak. Melakukan zip -r -X Archive.zip myfolderpada folder masih menghasilkan file zip yang berisi file .DS_Store.
Rockallite
@Rockallite: Anda benar ini hanya akan berfungsi ketika Anda zip folder, pohon atau file di folder Anda. Oleh karena itu Anda tidak dapat melewati folder sebagai argumen atau itu tidak akan berfungsi seperti yang diharapkan, hanya dengan * wildcard akan ini bekerja.
pompalini
Ini berfungsi untuk file di dalam direktori, bukan zip folder lengkap.
Michael Trouw
26

Perintah ini melakukannya untuk saya:

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

Target.zipadalah file zip untuk dibuat. Sourceadalah file sumber / folder untuk di-zip up. Dan _xparameter menentukan file / folder yang tidak termasuk. Jika hal di atas tidak berhasil karena alasan apa pun, coba ini sebagai gantinya:

zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
Adil Hussain
sumber
OP bertanya bagaimana mengecualikan folder __MACOSX. Cuplikan kode pertama Anda jelas tidak berfungsi, karena tidak menyebutkannya sebagai folder untuk dikecualikan.
Chris Johnson
7
The ziputilitas baris perintah tidak pernah menciptakan __MACOSXdirektori, sehingga potongan pertama tidak bekerja, dan -x "__MACOSX"bagian tidak diperlukan.
nisetama
15

Saya menggunakan Script Shell Automator ini untuk memperbaikinya setelah. Itu muncul sebagai item menu kontekstual (mengklik kanan pada file yang muncul di Finder).

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. Buat Layanan baru dengan Automator
  2. Pilih "File dan Folder" di "Finder"
  3. Tambahkan "Shell Script Action"

skrip shell automator

item menu kontekstual di Finder

benedikt
sumber
Bukankah lebih baik melakukan kompresi menggunakan zip di Automator Shell Script, daripada kompres menggunakan Apple bawaan, lalu menghapus file yang tidak diinginkan?
Matt
@Matt Anda dapat menambahkan langkah arsip di automator atau menggunakan perintah shell lain juga.
ttimasdf
@ Matt juga, Apple bawaan menangani penamaan file otomatis dan peningkatan nama saat file ada. Dengan skrip shell bagian ini akan banyak pekerjaan.
ttimasdf
1
Itu melempar kesalahan jika folder .DS_Store tidak ada dalam arsip. Saya menyarankan peningkatan dengan menambahkan `|| true` setelah setiap perintah zip (seperti zip -d "$p" __MACOSX/\* || truedalam jawaban Anda.
adamsfamily
1
Sementara jawaban lain baik, saya suka yang terbaik karena ini dapat digunakan dengan cara yang sangat Macish.
not2savvy
10

Folder yang tidak diinginkan juga dapat dihapus dengan cara berikut:

zip -d filename.zip "__MACOSX*"

Berfungsi terbaik untuk saya

SabU
sumber
8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": abaikan __MACOSX seperti yang Anda sebutkan.
  • -x "*/\.*": abaikan file tersembunyi, seperti .DS_Store.
  • Kutip variabel untuk menghindari file jika dinamai dengan SPACE.

Selain itu, Anda dapat membuat Layanan Automator agar mudah digunakan di Finder. Periksa tautan di bawah untuk melihat detail jika Anda perlu.

Github

Jian Jason
sumber
Heh, satu-satunya jawaban yang benar di antara lautan sampah, adalah juga dengan suara terbanyak. / sigh
Heath Raftery
Itu bekerja untuk saya tetapi saya harus menghapus tanda kutip sekitar dan simbol dolar sebelum destFileName.zip dan srcFileName
Alexander Poleschuk
3

The ziputilitas baris perintah tidak pernah menciptakan __MACOSXdirektori, sehingga Anda hanya dapat menjalankan perintah seperti ini:

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

Dalam output di bawah ini, a.zipyang saya buat denganzip utilitas baris perintah tidak mengandung __MACOSXdirektori, tetapi a 2.zipyang saya buat dari Finder tidak.

$ 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_Storetidak mengecualikan .DS_Storefile di dalam direktori tetapi -x \*.DS_Storetidak.

File tingkat atas dari arsip zip dengan banyak file biasanya harus berupa direktori tunggal, karena jika tidak, beberapa utiliti yang tidak diarsipkan (seperti unzip dan 7z, tetapi bukan Archive Utility, The Unarchiver unar,, ataudtrx ) tidak membuat direktori yang berisi untuk file ketika arsip diekstraksi, yang sering membuat file sulit ditemukan, dan jika banyak arsip seperti itu diekstraksi pada saat yang sama, mungkin sulit untuk mengetahui file mana yang termasuk dalam arsip mana.

Utilitas Arsip hanya menciptakan a __MACOSX direktori ketika Anda membuat arsip di mana setidaknya satu file berisi metadata seperti atribut yang diperluas, flag file, atau garpu sumber daya. The __MACOSXdirektori berisi file AppleDouble yang nama file dimulai dengan ._yang digunakan untuk menyimpan metadata OS X spesifik. The ziputilitas membuang baris perintah metadata seperti atribut diperpanjang, bendera file, dan sumber daya garpu, yang juga berarti bahwa metadata seperti tag hilang, dan bahwa alias berhenti bekerja, karena informasi dalam file alias disimpan dalam sumber daya garpu.

Biasanya Anda hanya bisa membuang metadata spesifik OS X, tetapi untuk melihat apa yang terkandung dalam file metadata, Anda dapat menggunakannya xattr -l. xattrjuga termasuk garpu sumber daya dan bendera file, karena meskipun sebenarnya tidak disimpan sebagai atribut diperluas, mereka dapat diakses melalui antarmuka atribut diperluas. Utilitas Arsip dan ziputilitas baris perintah membuang ACL.

nisetama
sumber
Ini hanya berfungsi untuk direktori, bukan untuk banyak file di dalam direktori.
Michael Trouw
@MichaelTrouw Ya, tetapi Anda biasanya tidak harus membuat arsip yang berisi banyak file di tingkat atas.
nisetama
Saya setuju untuk tidak setuju karena ada kasus penggunaan di mana ini baik-baik saja. Sebagai contoh, di mana pengguna akhir zipfile tidak akan pernah menjadi pengguna. Tapi server.
Michael Trouw
3

Kamu tidak bisa

Tetapi yang dapat Anda lakukan adalah menghapus folder-folder yang tidak diinginkan setelah zip. Baris perintah zipmengambil argumen yang berbeda di mana satu, yaitu -d, untuk menghapus konten berdasarkan regex. Jadi Anda bisa menggunakannya seperti ini:

zip -d filename.zip __MACOSX/\*
Alejandro Pablo Tkachuk
sumber
2

jangan zip file tersembunyi apa pun:

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

dengan pertanyaan ini, seharusnya seperti:

zip newzipname filename.any  -x "\__MACOSX"

Harus dikatakan, meskipun, perintah zip berjalan di terminal hanya mengompresi file, itu tidak memampatkan yang lain. Jadi lakukan ini hasilnya sama:

zip newzipname filename.any
Xian Shu
sumber
__MACOSXtidak memulai dengan.
PJMeisch
ya, saya membuat kesalahan. Itu telah dimodifikasi. Terima kasih telah mengingatkan saya
Xian Shu
1

Apakah maksud Anda zipalat baris perintah atau perintah Kompres Pencari?

Sebab zip, Anda bisa mencoba --data-forkopsi. Jika itu tidak berhasil, Anda dapat mencoba--no-extra , meskipun itu tampaknya mengabaikan metadata file lain yang mungkin berharga, seperti waktu uid / gid dan file.

Untuk perintah Compress Finder's, saya tidak percaya ada opsi untuk mengontrol perilakunya. Ini untuk kasus sederhana.

Alat lainnya, dan mungkin yang digunakan Finder sebenarnya di bawah tenda, adalah ditto. Dengan -c -kopsi - opsi itu, ia menciptakan arsip zip. Dengan alat ini, Anda dapat melakukan percobaan dengan --norsrc, --noextattr, --noqtn, --noacldan / atau hanya meninggalkan dari --sequesterRsrcpilihan (yang menurut halaman manual, mungkin bertanggung jawab untuk __MACOSXsubdirektori). Meskipun, mungkin tidak adanya --sequesterRsrcsarana untuk menggunakan format AppleDouble, yang akan membuat file ._ di semua tempat alih-alih satu __MACOSXdirektori.

Ken Thomases
sumber
1
Ya, saya mengacu pada utilitas "Kompres" finder. Karena itu, saya mendapatkan folder yang penuh dengan file ._ yang mengacaukan penampilan / editor WordPress
Scott B
1

Saya punya solusi yang lebih baik setelah membaca semua jawaban yang ada. Semuanya bisa dilakukan dengan alur kerja dalam satu klik kanan. TIDAK ada perangkat lunak tambahan, TIDAK ada baris perintah yang rumit, dan tidak ada trik shell.

Alur kerja automator:

  • Input: file atau folder dari aplikasi apa pun.
  • Langkah 1: Buat Arsip, sistem yang dibangun dengan parameter default.
  • Langkah 2: Jalankan perintah Shell, dengan input sebagai parameter. Salin perintah di bawah ini.

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

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

Simpan itu dan kita selesai! Cukup klik kanan folder atau sebagian besar file dan pilih workflow dari menu layanan. Arsip tanpa metadata akan dibuat di samping.

Sampel

ttimasdf
sumber
0

Ini adalah cara saya menghindari __MACOSXdirektori ketika kompres file dengan tarperintah:

$ 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

Hapus dulu atributnya:

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

Jalankan find . | xargs xattr -llagi, pastikan tidak ada file yang memiliki atribut xattr. maka Anda baik untuk pergi:

tar cjvf file.tar.bz2 dir

Zhang Huangbin
sumber