Mengapa saya mendapatkan file seperti ._foo di tarball saya di OS X?

70

Ketika saya tar file tertentu di OS X:

tar cvf foo.tar foo

Ini menghasilkan file tambahan ._foodi tarball:

./._foo
foo

yang hanya muncul jika saya mengekstraknya di sistem operasi non-Mac. Tetapi ._footidak ada di sistem file saya! Apa yang sedang terjadi? Bagaimana saya bisa menyingkirkannya?

Jesse Beder
sumber
Benci itu. Terlihat jelek ketika saya browsing di dalam arsip dengan 7-Zip.
Nathaniel

Jawaban:

79

Tar OS X menggunakan format AppleDouble untuk menyimpan atribut dan ACL yang diperluas.

$ 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 juga tahu cara mengubah anggota ._ kembali ke format asli, tetapi file ._ biasanya disimpan ketika arsip diekstraksi pada platform lain. Anda dapat memberitahu tar untuk tidak memasukkan metadata dengan menetapkan COPYFILE_DISABLE ke beberapa nilai:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
  • Fungsi copyfile dijelaskan dalam man copyfile
  • ls -l@menunjukkan kunci dan ukuran atribut yang diperluas, ls -lemencetak ACL
  • xattr -l daftar kunci dan nilai atribut yang diperluas
  • xattr -c menghapus semua atribut yang diperluas (-d tidak bisa digunakan sendiri)
  • chmod -N menghapus ACL
  • File zip yang dibuat pada OS X menggunakan folder __MACOSX untuk menyimpan metadata yang serupa

Informasi yang disimpan sebagai atribut yang diperluas:

  • Fork sumber daya (forks resource telah diperluas atribut sejak 10.4)
    • Ikon khusus diatur di Finder dan gambar file Ikon
    • Metadata dalam file PSD
    • Objek yang disimpan dalam file scpt, status jendela AppleScript Editor, deskripsi skrip
  • Informasi tentang alias (alias berhenti berfungsi jika atribut yang diperluas dihapus)
  • Status karantina atau URL sumber file yang diunduh dari internet
  • Komentar sorotan
  • Pengkodean file disimpan dengan TextEdit
  • Posisi caret file dibuka dengan TextMate
  • Catatan skim
Jesse Beder
sumber
Saya memiliki GNU tar 1.15.1 secara default di MacOS X 10.5.8 (Leopard). Versi terbaru dari GNU adalah 1.22 (Maret 2009). Diunduh dan dibangun: tampaknya tidak memiliki '--no-xattrs' saat dibuat di MacOS X.
Jonathan Leffler
1
Alih-alih mengekspor variabel ini ke seluruh sistem, Anda juga dapat menggunakan env COPYFILE_DISABLE tar -cf archive.tar my_folder/.
Georg Schölly
1
@ Cawas, masalahnya adalah mereka muncul di tarball, yang kemudian saya bagikan lintas platform, dan mereka tidak memiliki arti pada sistem operasi non-Apple.
Jesse Beder
1
Itu benar Jesse, mereka memang tidak memiliki arti untuk OS / sistem file lain . Tetapi info ada di sana dan kita bisa catatau typeuntuk melihat apa yang ada di dalamnya, paling tidak. Dan biasanya ada teks sederhana yang dimasukkan secara manual di sana. Saya tidak akan membuangnya untuk cadangan tetapi bisa menjadi sampah jika Anda ingin mendistribusikan sesuatu lintas platform dan khususnya jika ada di sana karena kesalahan. Hanya mengatakan opsi untuk meninggalkan mereka cukup valid.
cregox
1
FYI, Jalur ekspor untuk Leopard juga berfungsi untuk Lion.
jjeaton
12

Pada bsdtar 3.0.3 - libarchive 3.0.3(dan mungkin sebelumnya) ada opsi baru untuk bsdtarperintah yang dipanggil --disable-copyfileuntuk menekan pembuatan ._file.

# 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
sumber
3
Dengan bsdtar 2.8.3 - libarchive 2.8.3dari 10.7.5yang --disable-copyfiletidak didokumentasikan tetapi tersedia tetap.
Stefan Schmidt
github.com/libarchive/libarchive/commit/... dan forums.macrumors.com/showthread.php?p=20684196#post20684196 menarik perhatian dokumentasi usang dari Apple.
Graham Perrin
1

The ._file sumber daya garpu seperti yang disebutkan dalam jawaban lainnya. Namun, ada cara yang lebih baik untuk menghilangkannya saat menggunakan tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

Ada juga dot_cleanutilitas untuk membersihkan file-file ini (saya pikir ini biasanya digunakan untuk penyimpanan eksternal).

jtbandes
sumber
Terima kasih! Lihat akhir jawaban saya di atas untuk solusi itu.
Jesse Beder
dot_clean tidak berfungsi karena tar membuat file
joedevon
0

Berikut ini adalah skrip python untuk menghapus file-file itu. Harus bekerja di OS populer apa pun.

Tidak diuji secara menyeluruh, gunakan dengan risiko Anda sendiri!

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
sumber
1
Nah, kecuali untuk OS X dengan HFS + ...
Daniel Beck
Kenapa tidak? Bisakah Anda menyarankan cara memperbaikinya?
Aivar
1
File-file ini sebenarnya tidak ada di HFS +, karena sistem file dapat menyimpan metadata secara internal. File-file ini adalah solusi untuk sistem file yang tidak mendukung itu, misalnya ketika Anda mentransfer file dari HFS + ke USB thumb drive FAT, mereka muncul, dan ketika Anda mentransfernya kembali, mereka menghilang.
Daniel Beck
-3

Karakter periode, ".", Digunakan pada platform Mac sebagai indikator file tersembunyi. Di Windows, itu adalah karakter "$". Bagaimanapun, file ._foo mungkin menyimpan beberapa informasi spesifik OS X dan saya akan merekomendasikan untuk tidak menghapusnya. Pada sistem lain, Anda harus mengabaikannya, atau seseorang di sini mungkin dapat memberi Anda skrip yang akan menyembunyikan file dan folder yang dimulai dengan ".".

dbmikus
sumber
Itu semua metadata, sebagian besar hal-hal seperti ikon khusus, aplikasi yang membuat file dll. Aman untuk dihapus.
dreamlax
Namun, jika Anda terutama menggunakan Mac, saya akan merekomendasikan untuk menyimpannya. Jika Anda menggunakan Windows lebih dari OS X, maka lanjutkan dan bunuh.
dbmikus
(@dreamlax) Memang benar bahwa banyak data yang disimpan dalam atribut diperluas adalah metadata yang mungkin aman untuk dihapus, tetapi itu tidak selalu terjadi. Secara khusus, ketika file dengan "garpu sumber daya" disimpan pada sesuatu yang bukan berasal dari HFS (FAT, UFS, tar, dll.) File '._ *' ini digunakan untuk menyimpan data dari (di antara atribut diperluas lainnya) garpu sumber daya. Sementara banyak format file bergerak menjauh dari penggunaan fork resource (menuju bundel), ada beberapa file di mana data penting disimpan dalam fork resource (terkadang data resource adalah satu-satunya data).
Chris Johnsen