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

Scott B.
źródło
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ć.

sinuhepop
źródło
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/\*

Chris Johnson
źródło
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.

pompalini
źródło
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"
Adil Hussain
źródło
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

benedikt
źródło
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

SabU
źródło
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

Jian Jason
źródło
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.

nisetama
źródło
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/\*
Alejandro Pablo Tkachuk
źródło
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
Xian Shu
źródło
__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.

Ken Thomases
źródło
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

ttimasdf
źródło
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

Zhang Huangbin
źródło