Почему я получаю файлы типа ._foo в моем архиве на OS X?


70

Когда я tar некоторые файлы в OS X:

tar cvf foo.tar foo

Он создает дополнительный файл ._fooв tarball:

./._foo
foo

который появляется только в том случае, если я извлекаю его в операционной системе не Mac. Но ._fooне существует в моей файловой системе! В чем дело? Как я могу избавиться от этого?


Ненавижу это. Выглядит некрасиво, когда я просматриваю архивы с 7-Zip.
Натаниэль

Ответы:


79

Tar 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

Tar OS X также знает, как преобразовать элементы ._ обратно в собственные форматы, но файлы ._ обычно сохраняются при извлечении архивов на других платформах. Вы можете указать tar не включать метаданные, установив для COPYFILE_DISABLE значение:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
  • Функции copyfile описаны в 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 г.). Скачано и собрано: у него нет «--no-xattrs» при сборке в MacOS X.
Джонатан Леффлер

1
Вместо экспорта этой переменной во всю систему вы также можете использовать env COPYFILE_DISABLE tar -cf archive.tar my_folder/.
Георг Шолли

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

1
Это правда, Джесси, они действительно не имеют никакого значения для других ОС / файловых систем . Но информация есть, и мы можем catили type, по крайней мере, посмотреть, что внутри. И это обычно что-то простой текст, который был введен вручную. Я бы не выбрасывал его для резервного копирования, но это может быть мусором, если вы хотите распространять что-то кроссплатформенное и особенно если это происходит по ошибке. Просто сказать, что возможность их оставить, вполне допустимо.
Cregox

1
К вашему сведению, экспортная линия для Leopard также работает для Lion.
Джеятон

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
Стефан Шмидт

github.com/libarchive/libarchive/commit/… и forums.macrumors.com/showthread.php?p=20684196#post20684196 обращают внимание на устаревшую документацию Apple.
Грэм Перрен

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
Ну, кроме OS X с HFS + ...
Даниэль Бек

Почему нет? Можете ли вы предложить, как исправить?
Айвар

1
Эти файлы на самом деле не существуют в HFS +, поскольку файловая система может хранить метаданные внутри себя. Эти файлы - обходной путь для файловых систем, которые не поддерживают это, например, когда вы переносите файлы с HFS + на флэш-накопитель USB FAT, они появляются, а когда вы переносите их обратно, они исчезают.
Даниэль Бек

-3

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


Это все метаданные, в основном такие вещи, как пользовательские значки, приложение, создавшее файл и т. Д. Можно безопасно удалить.
Dreamlax

Тем не менее, если вы в первую очередь используете Mac, я бы порекомендовал сохранить его. Если вы используете Windows больше, чем OS X, тогда убейте ее.
dbmikus

(@dreamlax) Это правда, что большая часть данных, хранящихся в расширенных атрибутах, представляет собой метаданные, которые можно безопасно удалить, но это не всегда так. В частности, когда файлы с «ветвями ресурсов» хранятся в чем-то, что не является производным от HFS (FAT, UFS, tar и т. Д.), Эти файлы ._ * используются для хранения данных (среди других расширенных атрибутов) ресурс вилки. Хотя многие форматы файлов отходят от использования вилок ресурсов (в сторону пакетов), в некоторых файлах критические данные хранятся в ветке ресурсов (иногда данные ресурсов являются единственными данными).
Крис Джонсен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.