Czy utworzyć archiwum tar katalogu, oprócz ukrytych plików?

17

Chcę utworzyć archiwum tar dla określonego katalogu (oczywiście z jego podkatalogami). Ale kiedy to robię, za pomocą polecenia tar otrzymuję listę plików, które zostały uwzględnione, na przykład:

kalendarz_końcowy /._ style.css

kalendarz_końcowy / style.css

Jak widać, istnieją dwie wersje tego samego pliku. Dotyczy to każdego pliku i jest ich wiele. Jak wykluczyć pliki tymczasowe z prefiksem ._ z archiwum tar?

Rui F. Ribeiro
źródło
Może to pomóc: unix.stackexchange.com/questions/2213/…
tshepang
Nie są to pliki tymczasowe, ale reprezentują metadane systemu plików OS X (jeśli się nie mylę, zawierają etykiety Findera, kody typów i twórców, rozszerzone atrybuty itp.). Te pliki nie istnieją przed utworzeniem tar w OS X. Możliwe odpowiedzi zależą od tego, czy korzystasz z OS X / HFS +, czy innego systemu.
Daniel Beck

Odpowiedzi:

33

W komentarzu napisałeś, że pracujesz w systemie Mac OS X. Jest to ważna wskazówka na temat celu tych ._*plików.

Te ._*wpisy archiwalne są fragmentami danych AppleDouble, które zawierają dodatkowe informacje związane z odpowiednim plikiem (ten bez ._prefiksu). Są one generowane przez specyficzną dla Mac OS X rodzinę funkcji copyfile (3) . Obiekty blob AppleDouble przechowują dane kontroli dostępu (ACL) i rozszerzone atrybuty (zwykle flagi Findera i „widelce zasobów”, ale xattrs mogą być używane do przechowywania dowolnego rodzaju danych).

Dostarczone przez system narzędzia do archiwizacji Mac OS X ( bsdtar(również symbolizowane jako tar), gnutari pax) wygenerują element ._*archiwum dla każdego pliku, z którym powiązane są dowolne informacje rozszerzone; w trybie „niezarchiwizowanym” dekodują również tych członków archiwum i stosują uzyskane rozszerzone informacje do powiązanego pliku. Tworzy to archiwum „pełnej wierności” do użytku w systemach Mac OS X, zachowując, a następnie wyodrębniając wszystkie informacje, które może przechowywać system plików HFS +.

Odpowiednie narzędzia do archiwizacji w innych systemach nie wiedzą, jak obsługiwać te ._*pliki, więc są one rozpakowywane jak zwykłe pliki. Ponieważ takie pliki są dość bezużyteczne w innych systemach, często są postrzegane jako „niepotrzebne pliki”. Odpowiednio, jeśli system inny niż Mac OS X wygeneruje archiwum zawierające normalne pliki, które zaczynają się od ._, narzędzia do archiwizacji Mac OS X spróbują dekodować te pliki jako informacje rozszerzone.

Istnieje jednak nieudokumentowany (?) Sposób, aby dostarczone przez system archiwizatory Mac OS X zachowywały się tak, jak w innych systemach Unixy: zmienna środowiskowa COPYFILE_DISABLE. Ustawienie tej zmiennej (na dowolną wartość, nawet pusty ciąg znaków) uniemożliwi archiwizatorom generowanie ._*elementów archiwalnych do reprezentowania jakichkolwiek rozszerzonych informacji związanych z zarchiwizowanymi plikami. Jego obecność uniemożliwi również archiwizatorom interpretację takich członków archiwum jako rozszerzonych informacji.

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

Możesz ustawić tę zmienną w pliku inicjalizacji powłoki, jeśli chcesz pracować w ten sposób częściej niż nie.

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

Następnie, gdy trzeba ponownie włączyć tę funkcję (aby zachować / przywrócić rozszerzone informacje), można „rozbroić” zmienną dla poszczególnych poleceń:

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

Archiwa w systemie Mac OS X 10.4 również robią coś podobnego, chociaż używają innej zmiennej środowiskowej: COPY_EXTENDED_ATTRIBUTES_DISABLE

Chris Johnsen
źródło
ktoś widział, że to nie działa? Wypróbowałem to rozwiązanie na Yosemite i kiedy rozpakowuję na pudełku AIX, katalogi PaxHeader są nadal generowane
conorgriffin
5

To powinno działać:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'
Frederik Deweerdt
źródło
Myślałem, że zadziałało, ale tak naprawdę po rozpakowaniu archiwum odkryłem, że zostały one uwzględnione: /
Dziwne, jakiej wersji smoły używasz? tar --versiondaje GNU 1.23 tutaj.
Frederik Deweerdt,
1
Te pliki są metadanymi systemu plików w systemie OS X i nie istnieją przed uruchomieniem tar, więc prawdopodobnie nie można ich w ten sposób wykluczyć. Są one uwzględnione, aby umożliwić przywrócenie metadanych pliku OS X podczas rozpakowywania zarchiwizowanego na innym komputerze Mac.
Daniel Beck
Pracuje dla mnie. Polecam za pomocą, tar vzcf ...aby sprawdzić, czy zostały dołączone nieprawidłowe pliki.
stribika
@stribika Jest najprawdopodobniej na OS X. Zobacz mój komentarz do pytania. Pliki nie mogą zostać wykluczone, ponieważ nie istnieją poza archiwum tar.
Daniel Beck
2

Frederik Deweerdt podał rozwiązanie, które działa na tarce GNU (używanej w Linuksie, Cygwin, FreeBSD, OSX, ewentualnie innych), ale nie w innych systemach, takich jak NetBSD, OpenBSD lub Solaris.

POSIX nie określa tarpolecenia (ponieważ zmienia się zbyt dziko między wariantami uniksowymi) i paxzamiast tego wprowadza polecenie. Opcja -woznacza utworzenie archiwum ( -rwyciągów) i -xwybór formatu archiwum. Opcja -s '!BRE!!'wyklucza wszystkie pliki, których ścieżka jest zgodna z podstawowym wyrażeniem regularnym BRE.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar
Gilles „SO- przestań być zły”
źródło
Ciekawe ... Nie wiedziałem o Paxie.
Gabe.
2

Począwszy od bsdtar 3.0.3 - libarchive 3.0.3(i być może wcześniej) pojawiła się nowa opcja (specyficzna dla systemu Mac OS X) dla bsdtarpolecenia wywoływanego w --disable-copyfilecelu powstrzymania tworzenia ._plików. Starsze wersje tarnie mają tej --disable-copyfileopcji, ale ustawienie zmiennej środowiskowej COPYFILE_DISABLE=1powinno działać.

MDM
źródło
Wraz bsdtar 2.8.3 - libarchive 2.8.3z nie jest udokumentowany, ale mimo wszystko dostępne. 10.7.5--disable-copyfile
Stefan Schmidt
0

Wykonaj następujące kroki:

  1. Znajdź wszystkie ._pliki i wyświetl je za pomocą -ls, abyś mógł zobaczyć wszystkie ._pliki i je ostatecznie usunąć.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Utwórz archiwum .tar za pomocą.

    tar -cvf name.tar /path/to/directory
    
Ayush Dhanai
źródło