Dlaczego dostaję pliki takie jak ._foo do mojego archiwum na OS X?

70

Podczas tarowania niektórych plików w systemie OS X:

tar cvf foo.tar foo

Tworzy dodatkowy plik ._foow tarballu:

./._foo
foo

który pojawia się tylko wtedy, gdy wypakuję go w systemie operacyjnym innym niż Mac. Ale ._foonie istnieje w moim systemie plików! Co się dzieje? Jak mogę się tego pozbyć?

Jesse Beder
źródło
Nienawidzę tego. Wygląda brzydko, gdy przeglądam archiwa za pomocą 7-Zip.
Nathaniel

Odpowiedzi:

79

Tar OS OS używa formatu AppleDouble do przechowywania rozszerzonych atrybutów i list ACL.

$ touch file1 file2 file3
$ xattr -w key value file1
$ chmod +a 'admin allow delete' file2
$ ls -le@ *
-rw-r--r--@ 1 lauri  staff  0 May 25 07:09 file1
    key 5
-rw-r--r--+ 1 lauri  staff  0 May 25 07:09 file2
 0: group:admin allow delete
-rw-r--r--  1 lauri  staff  0 May 25 07:09 file3
$ tar -cf 1.tar *
$ tar -tf 1.tar
./._file1
file1
./._file2
file2
file3

Tar OS X wie także, jak przekonwertować członków ._ z powrotem do formatów macierzystych, ale pliki ._ są zwykle przechowywane, gdy archiwa są rozpakowywane na innych platformach. Możesz powiedzieć tarowi, aby nie dołączał metadanych, ustawiając COPYFILE_DISABLE na pewną wartość:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
  • Funkcje pliku kopii opisano w rozdziale man copyfile
  • ls -l@pokazuje klucze i rozmiary rozszerzonych atrybutów, ls -ledrukuje listy ACL
  • xattr -l wymienia klucze i wartości rozszerzonych atrybutów
  • xattr -c usuwa wszystkie rozszerzone atrybuty (-d nie można używać samodzielnie)
  • chmod -N usuwa listy ACL
  • Pliki zip utworzone w systemie OS X używają folderu __MACOSX do przechowywania podobnych metadanych

Informacje przechowywane jako atrybuty rozszerzone:

  • Widelce zasobów (widelce zasobów zostały rozszerzone atrybuty od 10.4)
    • Niestandardowe ikony ustawione w Finderze i obrazy plików Icon \ r
    • Metadane w plikach PSD
    • Obiekty przechowywane w plikach scpt, stan okna edytora AppleScript, opisy skryptów
  • Informacje o aliasach (aliasy przestają działać po usunięciu atrybutów rozszerzonych)
  • Status kwarantanny lub źródłowe adresy URL plików pobranych z Internetu
  • Komentarze w centrum uwagi
  • Kodowanie plików zapisanych za pomocą TextEdit
  • Pozycja Caret plików otwieranych za pomocą TextMate
  • Odtłuszczone notatki
Jesse Beder
źródło
Mam GNU tar 1.15.1 domyślnie na MacOS X 10.5.8 (Leopard). Najnowsza wersja GNU to 1.22 (marzec 2009). Pobrane i zbudowane: wydaje się, że nie ma „--no-xattrs” po zbudowaniu na MacOS X.
Jonathan Leffler
1
Zamiast eksportować tę zmienną do całego systemu, możesz również użyć env COPYFILE_DISABLE tar -cf archive.tar my_folder/.
Georg Schölly,
1
@Cawas, problem polegał na tym, że pojawili się w tarballu, który następnie dystrybuowałem na wiele platform, i nie mają znaczenia w systemie operacyjnym innym niż Apple.
Jesse Beder
1
To prawda, Jesse, w rzeczywistości nie mają znaczenia dla innych systemów / systemów plików . Ale informacja jest tam i możemy catlub typezobaczyć, co jest w środku, co najmniej. I zwykle jest to prosty tekst, który został tam ręcznie wprowadzony. Nie wyrzuciłbym tego do tworzenia kopii zapasowych, ale może to być kosz na wypadek, gdybyś chciał dystrybuować coś między platformami, a zwłaszcza, jeśli jest to przez pomyłkę. Samo powiedzenie opcji ich pozostawienia jest dość ważne.
cregox,
1
Do Twojej wiadomości Linia eksportu dla Leoparda działa również dla Lion.
jjeaton
12

Od bsdtar 3.0.3 - libarchive 3.0.3(i być może wcześniej) w bsdtarkomendzie pojawiła się nowa opcja, --disable-copyfileaby wyłączyć tworzenie ._plików.

# on Mac OS X
# /usr/bin/tar -> bsdtar
ls -l /usr/bin/tar    

# from man bsdtar
--disable-copyfile
        Mac OS X specific.  Disable the use of copyfile(3).
MDM
źródło
3
Wraz bsdtar 2.8.3 - libarchive 2.8.3z nie jest udokumentowany, ale mimo wszystko dostępne. 10.7.5--disable-copyfile
Stefan Schmidt
github.com/libarchive/libarchive/commit/… i forums.macrumors.com/showthread.php?p=20684196#post20684196 zwracają uwagę na nieaktualną dokumentację Apple.
Graham Perrin,
1

Te ._pliki są widelce zasobów jak wspomniano w innych odpowiedzi. Istnieje jednak lepszy sposób na pozbycie się ich podczas używania tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

Istnieje również dot_cleannarzędzie do czyszczenia tych plików (myślę, że zwykle jest używane do przechowywania danych zewnętrznych).

jtbandes
źródło
Dzięki! Zobacz koniec mojej powyższej odpowiedzi na to rozwiązanie.
Jesse Beder
dot_clean nie działa w tym przypadku, ponieważ tar tworzy pliki
dołączył
0

Oto skrypt Pythona do usuwania tych plików. Powinien działać w dowolnym popularnym systemie operacyjnym.

Nie gruntownie przetestowane, używaj na własne ryzyko!

import os
import os.path

def dot_clean(folder):
    files = os.listdir(folder)
    for file in files:
        full_name = folder + "/" + file
        if os.path.isdir(full_name):
            dot_clean(full_name)
        elif file.startswith("._"):
            os.remove(full_name)

dot_clean('.')            
Aivar
źródło
1
Cóż, z wyjątkiem OS X z HFS + ...
Daniel Beck
Dlaczego nie? Czy możesz zasugerować, jak to naprawić?
Aivar,
1
Te pliki nie istnieją w systemie HFS +, ponieważ system plików może przechowywać metadane wewnętrznie. Pliki te są obejściem dla systemów plików, które nie obsługują tego, na przykład gdy przesyłasz pliki z HFS + na napęd USB FAT, pojawiają się one, a po ich przesłaniu znikają.
Daniel Beck
-3

Znak kropki „.” Jest używany na platformie Mac jako wskaźnik ukrytego pliku. W systemie Windows jest to znak „$”. W każdym razie plik ._foo prawdopodobnie zawiera pewne informacje specyficzne dla systemu OS X i odradzam jego usuwanie. W innych systemach będziesz musiał to zignorować, albo ktoś może tu dostarczyć skryptu, który ukryje pliki i foldery zaczynające się od „.”.

dbmikus
źródło
Są to wszystkie metadane, w większości takie jak niestandardowe ikony, aplikacja, która utworzyła plik itp. Można go bezpiecznie usunąć.
dreamlax
Jeśli jednak korzystasz głównie z komputera Mac, zalecam jego zachowanie. Jeśli używasz systemu Windows częściej niż OS X, zabij go.
dbmikus
(@dreamlax) Prawdą jest, że większość danych przechowywanych w atrybutach rozszerzonych to metadane, które można bezpiecznie usunąć, ale nie zawsze tak jest. W szczególności, gdy pliki z „widelcami zasobów” są przechowywane na czymś, co nie pochodzi z HFS (FAT, UFS, tar itp.), Te pliki „._ *” są używane do przechowywania danych (między innymi rozszerzonymi atrybutami) Widelce zasobów. Podczas gdy wiele formatów plików odchodzi od używania widelców zasobów (w kierunku pakietów), istnieją pewne pliki, w których krytyczne dane są przechowywane w rozwidleniu zasobów (czasami dane zasobów są jedynymi danymi).
Chris Johnsen