Чому я отримую такі файли, як ._foo у своєму tarball в OS X?


70

Коли я орієнтую певні файли в OS X:

tar cvf foo.tar foo

Він створює додатковий файл ._fooу тарболі:

./._foo
foo

що відображається лише в тому випадку, якщо я витягую його в операційній системі, що не працює на Mac. Але ._fooв моїй файловій системі не існує! Що відбувається? Як я можу його позбутися?


Ненавиджу це. Виглядає некрасиво, коли я переглядаю архіви 7-Zip.
Натаніел

Відповіді:


79

Дьоготь OS X використовує формат AppleDouble для зберігання розширених атрибутів та 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

Тарг OS X також знає, як перетворити. Можна сказати tar, щоб не включати метадані, встановивши COPYFILE_DISABLE на якесь значення:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
  • Функції копіювання файлів описані в man copyfile
  • ls -l@показує ключі та розміри розширених атрибутів, ls -leдрукує ACL
  • xattr -l перелічує ключі та значення розширених атрибутів
  • xattr -c очищає всі розширені атрибути (-d не можна використовувати поодинці)
  • chmod -N видаляє ACL
  • Файли Zip, створені на OS X, використовують папку __MACOSX для зберігання подібних метаданих

Інформація, що зберігається як розширені атрибути:

  • Вилки ресурсів (вилки ресурсів були розширені атрибути з 10.4)
    • Спеціальні значки, встановлені у Finder, та зображення файлів Icon
    • Метадані у файлах PSD
    • Об'єкти, що зберігаються у файлах scpt, стан вікна редактора AppleScript, описи скриптів
  • Інформація про псевдоніми (псевдоніми припиняють роботу, якщо розширені атрибути видалено)
  • Карантинний статус або вихідні URL-адреси файлів, завантажених з Інтернету
  • Короткі коментарі
  • Кодування файлів, збережених за допомогою TextEdit
  • Позиція карети файлів, відкритих за допомогою TextMate
  • Очисті ноти

У мене GNU tar 1.15.1 за замовчуванням на MacOS X 10.5.8 (Leopard). Остання версія від GNU - 1,22 (березень 2009 р.). Завантажено та вбудовано: у Mac OS X, схоже, немає "--no-xattrs"
Джонатан Леффлер

1
Замість експорту цієї змінної до всієї системи ви також можете використовувати env COPYFILE_DISABLE tar -cf archive.tar my_folder/.
Георг Шоллі

1
@Cawas, проблема полягала в тому, що вони з'явилися у тарболі, який я тоді розповсюджував крос-платформу, і вони не мають значення в операційній системі, що не належить Apple.
Джессі Бедер

1
Це правда Джессі, вони дійсно не мають значення для інших ОС / файлових систем . Але інформація є , і ми можемо catабо typeпобачити , що знаходиться всередині, по крайней мере. І це, як правило, щось простий текст, який туди вводили вручну. Я б не викидав його для резервного копіювання, але це може бути сміття у випадку, якщо ви хочете поширити щось кросплатформенне, а особливо, якщо воно є помилково. Просто сказати, що варіант залишити їх досить справедливий.
Крегокс

1
FYI, Експортна лінія для Leopard також працює для Лева.
jjeaton

12

Станом на bsdtar 3.0.3 - libarchive 3.0.3(а можливо, і раніше) є нова опція bsdtarкоманди, яка називається --disable-copyfileдля придушення створення ._файлів.

# 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).

3
З bsdtar 2.8.3 - libarchive 2.8.3з не документована , але тим не менш доступні. 10.7.5--disable-copyfile
Штефан Шмідт


1

Ці ._файли вилки ресурсів , як зазначено в інших відповідях. Однак є кращий спосіб позбутися від них під час використання tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

Існує також dot_cleanутиліта для очищення цих файлів (я думаю, вона зазвичай використовується для зовнішнього зберігання).


Дякую! Дивіться кінець моєї вище відповіді на це рішення.
Джессі Бедер

dot_clean не працює для цього, оскільки tar створює файли
joedevon

0

Ось сценарій python для видалення цих файлів. Має працювати в будь-якій популярній ОС.

Не ретельно перевірений, використовуйте на власний ризик!

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('.')            

1
Ну, крім ОС X з HFS + ...
Даніель Бек

Чому ні? Можете запропонувати, як виправити?
Айвар

1
Ці файли фактично не існують на HFS +, оскільки файлова система може зберігати метадані всередині. Ці файли є вирішенням для файлових систем, які не підтримують, наприклад, коли ви переносите файли з HFS + на палець FAT USB, вони з'являються, і коли ви переносите їх назад, вони зникають.
Даніель Бек

-3

Символ періоду "." Використовується на платформі Mac як індикатор прихованого файлу. У Windows це символ "$". У будь-якому випадку, файл ._foo, ймовірно, містить деяку інформацію щодо OS X, і я б рекомендував не видаляти його. В інших системах вам доведеться проігнорувати це, інакше хтось тут зможе надати вам сценарій, який приховуватиме файли та папки, що починаються з ".".


Це всі метадані, в основному такі речі, як користувацькі піктограми, програма, яка створила файл тощо. Видалити це безпечно.
dreamlax

Тим не менш, якщо ви в основному використовуєте Mac, я б рекомендував зберігати його. Якщо ви використовуєте Windows більше, ніж ОС X, тоді вперед і вбийте її.
dbmikus

(@dreamlax) Це правда, що велика частина даних, що зберігаються в розширених атрибутах, є метаданими, які їх можна безпечно видалити, але це не завжди так. Зокрема, коли файли з "ресурсами вилки" зберігаються на тому, що не є похідним HFS (FAT, UFS, tar тощо), ці файли '._ *' використовуються для зберігання даних (серед інших розширених атрибутів) ресурсні вилки. Незважаючи на те, що багато форматів файлів віддаляються від використання вилок ресурсів (у напрямку пакетів), є деякі файли, де критичні дані зберігаються у вилці ресурсу (іноді дані ресурсу є єдиними даними).
Кріс Джонсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.