3

Кто-нибудь знает, почему tar не включает файлы с именем .__init__.py (обратите внимание на точку)?

$ mkdir /tmp/work && cd /tmp/work
$ mkdir foo
$ touch foo/.__init__.py
$ touch foo/.namespace__init__.py
$ tar czf foo.tar.gz foo

$ mkdir e && mv foo.tar.gz e/ && cd e/
$ tar zxf foo.tar.gz
$ ls -al foo/
total 0
drwxr-xr-x  2 sridharr  wheel  102 14 Mar 17:16 .
drwxr-xr-x  3 sridharr  wheel  136 14 Mar 17:17 ..
-rw-r--r--  1 sridharr  wheel    0 14 Mar 17:16 .namespace__init__.py
$ 

$ echo ".__init__.py file is missing. WTF? This is OSX 10.6"

Обновление: tar, кажется, игнорирует файлы, начинающиеся с символов ._ ; Зачем?

Обновление 2: я не могу воспроизвести это на Linux.

3 ответа3

6

Нашел решение. В системах Apple файлы, начинающиеся с ._ содержат ветвь ресурса другого файла. Это не обычные файлы, которые можно копировать и перемещать.

6

Есть некоторые недокументированные (?) Переменные окружения, которые можно использовать для отключения специальной обработки расширенных атрибутов и / или разветвлений ресурсов в tarpax, для чего это стоит). rsync имеет опцию -E / --extended-attributes для включения (!) эта обработка - но на некоторых не-Apple rsync s -E означает - --executability вместо.

В Mac OS X 10.4 (в первом выпуске, в котором были созданы эти элементы архива ._* кодировкой AppleDouble), переменной среды является COPY_EXTENDED_ATTRIBUTES_DISABLE . В Leopard и Snow Leopard переменная равна COPYFILE_DISABLE . Как правило, переменные просто должны быть установлены. Подойдет любое значение (даже пустая строка), но true кажется традиционным. Таким образом:

COPY_EXTENDED_ATTRIBUTES_DISABLE=true COPYFILE_DISABLE=true tar …

Установка этой переменной имеет следующие эффекты:

  • При создании / обновлении архивов:
    • Предотвращает создание элементов архива ._* при архивировании файлов с расширенными атрибутами.
    • Позволяет создавать элементы архива ._* при архивировании актуальных файлов ._* .
  • При извлечении архивов:
    • Вызывает извлечение элементов архива ._* в виде простых файлов вместо восстановления расширенных атрибутов в связанном файле.

Короче говоря, установка этих переменных делает tar, et al. вести себя как они (например) Linux.

Если вам редко требуется архивировать файлы с расширенными атрибутами или ветвями ресурсов и вам может понадобиться архивировать или извлекать фактические файлы ._* , то вы можете рассмотреть возможность установки и экспорта этих переменных в один из файлов инициализации вашей оболочки:

# Tell tar, pax, etc. on Mac OS X 10.4+ not to archive
# extended attributes (e.g. resource forks) to ._* archive members.
# Also allows archiving and extracting actual ._* files.
COPY_EXTENDED_ATTRIBUTES_DISABLE=true COPYFILE_DISABLE=true
export COPY_EXTENDED_ATTRIBUTES_DISABLE COPYFILE_DISABLE

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

Файловая система HFS+, используемая в Mac OS X, прекрасно способна хранить фактические файлы ._* , поэтому, как только вы используете переменные для извлечения файлов в файловую систему, к файлам можно получить доступ всеми обычными способами.

1

Я не могу повторить это на хосте Debian 5.0. Возможно, есть ошибка в версии tar, установленной в используемой вами системе? Какую версию * nix вы используете?

$ mkdir foo
$ touch foo/.namespace__init__.py
$ touch foo/.__init__.py
$ tar -czvf foo.tar.gz foo/
foo/
foo/.namespace__init__.py
foo/.__init__.py

$ # example the file
$ tar -tzvf foo.tar.gz
drwxr-xr-x cfrancy/cfrancy   0 2010-03-14 17:34 foo/
-rw-r--r-- cfrancy/cfrancy   0 2010-03-14 17:34 foo/.namespace__init__.py
-rw-r--r-- cfrancy/cfrancy   0 2010-03-14 17:34 foo/.__init__.py

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