Kompresja zip na Maca bez folderu __MACOSX?


158

Kiedy kompresuję pliki za pomocą wbudowanego kompresora zip w systemie Mac OSX, w wyniku wyodrębnionego zipa powstaje dodatkowy folder o nazwie „__MACOSX”.

Czy mogę dostosować ustawienia, aby zapobiec tworzeniu tego folderu, czy muszę kupić narzędzie do kompresji innej firmy?

AKTUALIZACJA : właśnie znalazłem darmową aplikację dla OSX, która rozwiązuje mój problem: „ YemuZip ”

UPDATE 2 : YemuZip nie jest już oprogramowaniem darmowym


Istnienie folderu _MACOSX nie stwarza żadnego problemu. Po prostu go usuń.
— Jayprakash Dubey

1
To pytanie wydaje się być niezwiązane z tematem, ponieważ powinno być w AskDifferent
— Nakilon

11
Stwarza problem z wybrednymi usługami internetowymi, które wymagają nieskazitelnego archiwum zip, więc jestem wdzięczny za wyjaśnienia
— mccc

21
@JayprakashDubey To incredibily drażniących, a jako użytkownik Linuksa, którzy lubią nie pozostawiając śmieci wszędzie, gdzie idę, nie mogę znieść __MACOSX, .DS_Store, ._fileName, i wszystkie inne różne turds Mac OS spada w swoich archiwach. „Tar” OSX również to robi - w rażącym lekceważeniu zasady najmniejszego zdziwienia .
— Wyatt8740

Odpowiedzi:


80

Kiedy miałem ten problem, zrobiłem to z linii poleceń:

zip file.zip uncompressed

EDYCJA , po wielu negatywnych opiniach: Korzystałem z tej opcji jakiś czas temu i nie wiem, gdzie się jej nauczyłem, więc nie mogę dać ci lepszego wyjaśnienia. Chris Johnson odpowiedź jest poprawna, ale nie usunie moje. Jak mówi jeden z komentarzy, jest dokładniejszy do tego, o co pyta OP, ponieważ kompresuje bez tych plików, zamiast usuwać je ze skompresowanego pliku. Łatwiej mi też zapamiętać.


33
Brakuje wyjaśnienia.
— Raptor

2
Podkatalog __MACOSX / zawiera rozwidlenia zasobów Maca i jest tworzony podczas używania narzędzi Mac do tworzenia pliku zip. Podobnie narzędzia Mac będą zużywać podkatalog __MACOSX / w celu ustawienia rozwidleń zasobów, a Ty nawet go nie zobaczysz. Jeśli jednak użyjesz narzędzi Mac do utworzenia pliku zip i innych narzędzi do jego rozpakowania, otrzymasz katalog __MACOSX /, a nie rozwidlenia zasobów. Jeśli utworzysz plik za zippomocą aplikacji innej firmy, wówczas katalog __MACOSX / nigdy nie zostanie utworzony.
— Edward Falk

Zobacz moją odpowiedź na łatwy sposób usunięcia folderu _MACOSX po utworzeniu pliku zip.
— Chris Johnson

3
Aby skompresować katalog rekurencyjnie bez __MACOSX i innych:zip -rX file.zip uncompressed_directory
— Konstantin Suvorov

319

Można naprawić po fakcie do zip -d filename.zip __MACOSX/\*


51
aby również usunąć pliki .DS_Store:zip -d filename.zip \*/.DS_Store
— Benedikt Köppel

5
Zaakceptowana odpowiedź mówi, jak nie uzyskać katalogu __MACOSX / w pierwszej kolejności, ale nie mówi nic o tym, co zrobić z istniejącym plikiem .zip. Ta odpowiedź mówi, jak pozbyć się __MACOSX /, jeśli już go masz. Jednak pierwotne pytanie brzmiało, jak tego nie dostać, więc przyjęta odpowiedź jest poprawna.
— Edward Falk

Jak mogę to zrobić rekurencyjnie dla wszystkich plików zip?
— Wowfunhappy

Zastosowanie do wszystkich plików zip pod pewnym root: find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. Zamień swój punkt początkowy na ~.
— Chris Johnson

Funkcja usunąć wszystkie niepotrzebne pliki: cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }. Sposób użycia: cleanzip file.ziplub cleanzip file.zip MORE_JUNK_FILES(drugi parametr jest opcjonalny)
— mrdaliri

56

W folderze, który chcesz skompresować, w terminalu:

zip -r -X Archive.zip *

Gdzie -X oznacza: wyklucz te niewidoczne pliki zasobów Maca, takie jak „_MACOSX” lub „._Filename” i .ds przechowuj pliki

źródło

Uwaga: będzie działać tylko dla folderu i kolejnego drzewa folderów, w którym się znajdujesz, i musi mieć *symbol wieloznaczny.


9
To nie działa tak, jak myślisz: -Xnie wyklucza plików .DS_Store. Powodem, dla którego może to działać w przypadku Twojej aplikacji, jest to, że kompresujesz tylko *pliki, które są zgodne z symbolami wieloznacznymi, które nie zaczynają się od „.”. Wypróbuj go w katalogu zawierającym plik z kropką, a zobaczysz, że zostanie dołączony.
— spinup

Zobacz moją odpowiedź na łatwy sposób usunięcia folderu _MACOSX po utworzeniu pliku zip.
— Chris Johnson,

1
Nie. Wykonanie operacji zip -r -X Archive.zip myfolderna folderze nadal powoduje powstanie pliku ZIP zawierającego plik .DS_Store.
— Rockallite

@Rockallite: masz rację, to zadziała tylko wtedy, gdy spakujesz foldery, drzewo lub pliki w folderze, w którym się znajdujesz. Dlatego nie możesz przekazać folderu jako argumentu lub nie zadziała to zgodnie z oczekiwaniami, tylko z symbolem wieloznacznym * działa.
— pompalini

Działa to w przypadku plików w katalogach, zamiast spakowania całego folderu.
— Michael Trouw

26

To polecenie zrobiło to za mnie:

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

Target.zipto plik zip do utworzenia. Sourceto plik / folder źródłowy do skompresowania. A _xparametr określa plik / folder nie należą. Jeśli powyższe nie działa z jakiegokolwiek powodu, spróbuj zamiast tego:

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

OP zapytał, jak wykluczyć folder __MACOSX. Twój pierwszy fragment kodu oczywiście nie działa, ponieważ nie nazywa go folderem do wykluczenia.
— Chris Johnson,

7
Narzędzie zipwiersza poleceń nigdy nie tworzy __MACOSXkatalogu, więc pierwszy fragment kodu działa, a -x "__MACOSX"część nie jest potrzebna.
— nisetama

15

Używam tego skryptu Automator Shell, aby to naprawić później. Jest wyświetlany jako pozycja menu kontekstowego (kliknięcie prawym przyciskiem myszy dowolnego pliku wyświetlanego w Finderze).

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. Utwórz nową usługę za pomocą Automatora
  2. Wybierz „Pliki i foldery” w „Finderze”
  3. Dodaj „Akcję skryptu powłoki”

skrypt powłoki automatora

element menu kontekstowego w Finderze


Czy nie byłoby lepiej wykonać kompresję za pomocą zip w skrypcie powłoki Automator, zamiast kompresować za pomocą wbudowanego oprogramowania Apple, a następnie usunąć niechciane pliki?
— Matt

@Matt, możesz dodać krok archiwizacji w automacie lub użyć innego polecenia powłoki.
— ttimasdf

@Matt również wbudowane oprogramowanie Apple obsługuje automatyczne nazewnictwo plików i inkrementację nazwy, gdy plik istnieje. Ze skryptem powłoki ta część wymagałaby dużo pracy.
— ttimasdf

1
Zgłasza błąd, jeśli w archiwum nie ma folderu .DS_Store. Sugeruję poprawę poprzez dodanie `|| true` po każdym poleceniu zip (takim jak zip -d "$p" __MACOSX/\* || truew odpowiedzi.
— adamsfamily

1
Podczas gdy inne odpowiedzi są dobre, ta najbardziej mi się podoba, ponieważ można jej używać w bardzo Macish sposób.
— not2savvy

10

Niechciane foldery można również usunąć w następujący sposób:

zip -d filename.zip "__MACOSX*"

U mnie działa najlepiej


8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": ignoruj ​​__MACOSX, jak wspomniałeś.
  • -x "*/\.*": zignoruj ​​każdy ukryty plik, taki jak .DS_Store.
  • Cytuj zmienną, aby uniknąć pliku, jeśli ma nazwę SPACJA.

Możesz także zbudować usługę Automator, aby ułatwić korzystanie z niej w Finderze. Sprawdź link poniżej, aby zobaczyć szczegóły, jeśli potrzebujesz.

Github


Heh, jedyna poprawna odpowiedź wśród morza śmieci jest również tą, która ma najmniej głosów. / westchnienie
— Heath Raftery

U mnie zadziałało, ale musiałem usunąć cudzysłowy wokół i symbol dolara przed destFileName.zip i srcFileName
— Alexander Poleschuk

3

Narzędzie zipwiersza poleceń nigdy nie tworzy __MACOSXkatalogu, więc możesz po prostu uruchomić takie polecenie:

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

Poniższe dane wyjściowe, a.zipktóre utworzyłem za pomocą zipnarzędzia wiersza poleceń, nie zawierają __MACOSXkatalogu, ale a 2.zipktóry utworzyłem za pomocą Findera.

$ 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_Storenie wyklucza .DS_Storeplików wewnątrz katalogów, ale -x \*.DS_Storerobi.

Plik najwyższego poziomu archiwum zip z wieloma plikami powinien zwykle być pojedynczym katalogiem, ponieważ jeśli tak nie jest, niektóre narzędzia do archiwizacji (takie jak unzipi 7z, ale nie Archive Utility, The Unarchiver unarlubdtrx ) nie tworzą katalogu zawierającego pliki po rozpakowaniu archiwum, co często utrudnia ich znalezienie, a jeśli wiele archiwów jest rozpakowywanych w tym samym czasie, określenie, które pliki należą do którego archiwum, może być trudne.

Archive Utility tworzy __MACOSXkatalog tylko wtedy, gdy tworzysz archiwum, w którym co najmniej jeden plik zawiera metadane, takie jak atrybuty rozszerzone, flagi plików lub rozwidlenie zasobów. __MACOSXKatalog zawiera pliki, których nazwa pliku AppleDouble rozpoczyna się ._, które są używane do przechowywania OS X specyficzne metadanych. Narzędzie zipwiersza poleceń odrzuca metadane, takie jak atrybuty rozszerzone, flagi plików i rozwidlenia zasobów, co oznacza również, że metadane, takie jak znaczniki, są tracone, a aliasy przestają działać, ponieważ informacje w pliku aliasów są przechowywane w rozwidleniu zasobów.

Zwykle możesz po prostu odrzucić metadane specyficzne dla OS X, ale aby zobaczyć, jakie pliki metadanych zawierają, możesz użyć xattr -l. xattrzawiera również rozwidlenia zasobów i flagi plików, ponieważ nawet jeśli nie są one faktycznie przechowywane jako atrybuty rozszerzone, można uzyskać do nich dostęp poprzez interfejs atrybutów rozszerzonych. Zarówno Archive Utility, jak i zipnarzędzie wiersza poleceń odrzucają listy ACL.


Działa to tylko dla katalogów, a nie dla zbioru plików w katalogu.
— Michael Trouw

@MichaelTrouw Tak, ale zazwyczaj nie powinieneś tworzyć archiwum zawierającego wiele plików na najwyższym poziomie.
— nisetama

Zgadzam się nie zgodzić, ponieważ są przypadki użycia, w których jest to w porządku. Na przykład taki, w którym użytkownik końcowy pliku zip nigdy nie będzie użytkownikiem. Ale serwer.
— Michael Trouw

3

Nie możesz.

Ale co możesz zrobić, to usunąć te niechciane foldery po spakowaniu. Linia poleceń zipprzyjmuje różne argumenty, z których jeden, czyli -d, służy do usuwania zawartości na podstawie wyrażenia regularnego. Możesz więc używać tego w ten sposób:

zip -d filename.zip __MACOSX/\*

2

nie spakuj żadnego ukrytego pliku:

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

z tym pytaniem powinno wyglądać następująco:

zip newzipname filename.any  -x "\__MACOSX"

Trzeba jednak powiedzieć, że polecenie zip działa w terminalu tylko kompresując plik, nie kompresuje żadnych innych. Więc zrób to, wynik jest taki sam:

zip newzipname filename.any

__MACOSXnie zaczyna się od.
— PJMeisch

tak, popełniłem błąd. Został zmodyfikowany. Dzięki za przypomnienie mi
— Xian Shu

1

Masz na myśli zipnarzędzie wiersza poleceń czy polecenie kompresji Findera?

Dla zip, można spróbować --data-forkopcji. Jeśli to nie pomoże, możesz spróbować --no-extra, chociaż wydaje się, że ignoruje to inne metadane plików, które mogą być cenne, takie jak uid / gid i czasy plików.

Nie sądzę, aby w przypadku polecenia Finder's Compress można było kontrolować jego zachowanie. To dla prostego przypadku.

Drugim narzędziem, a może tym, którego Finder faktycznie używa pod maską, jest ditto. Dzięki -c -kopcjom tworzy archiwa zip. Za pomocą tego narzędzia można eksperymentować z --norsrc, --noextattr, --noqtn, --noacli / lub po prostu zostawić wyłączyć --sequesterRsrcopcję (które, według strony człowieka, może być odpowiedzialny za __MACOSXpodkatalogu). Chociaż być może brak --sequesterRsrcprostego oznacza użycie formatu AppleDouble, który utworzyłby pliki ._ w dowolnym miejscu zamiast w jednym __MACOSXkatalogu.


1
Tak, mam na myśli narzędzie „Compress” Findera. W tej chwili otrzymuję folder pełen plików ._, co psuje wygląd / edytor WordPressa
— Scott B

1

Mam lepsze rozwiązanie po przeczytaniu wszystkich istniejących odpowiedzi. Wszystko można było zrobić za pomocą przepływu pracy jednym kliknięciem prawym przyciskiem myszy. BEZ dodatkowego oprogramowania, ŻADNYCH skomplikowanych elementów wiersza poleceń i ŻADNYCH sztuczek powłoki.

Przepływ pracy automatora:

  • Wejście: pliki lub foldery z dowolnej aplikacji.
  • Krok 1: Utwórz archiwum, wbudowany system z domyślnymi parametrami.
  • Krok 2: Uruchom polecenie Shell z danymi wejściowymi jako parametrami. Kopiuj polecenie poniżej.

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

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

Zapisz to i gotowe! Po prostu kliknij prawym przyciskiem myszy folder lub większość plików i wybierz przepływ pracy z menu usług. Archiwum bez metadanych zostanie utworzone obok.

Próba


0

W ten sposób unikam __MACOSXkatalogu podczas kompresji plików za pomocą tarpolecenia:

$ 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

Najpierw usuń atrybut:

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

Uruchom find . | xargs xattr -lponownie, upewnij się, że żaden plik nie ma atrybutu xattr. więc jesteś gotowy:

tar cjvf file.tar.bz2 dir

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.