62

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

tar cvf foo.tar foo

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

./._foo
foo

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

5 ответов5

74

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
  • Обезжиренные заметки
11

Начиная с 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).
1

Файлы ._ являются вилками ресурсов, как упоминалось в других ответах. Тем не менее, есть лучший способ избавиться от них при использовании tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .