Создание архивов в macOS кажется простой задачей – до тех пор, пока вы не попробуете распаковать их в Linux. Внезапно появляются непонятные сообщения об «unknown extended header keyword» или дублирующиеся файлы с префиксом ._. Это классическая проблема несовместимости между реализацией tar в macOS (основанной на BSD) и GNU/Linux. Но не спешите винить системы: всё дело в особенностях работы с метаданными.
Почему macOS добавляет «лишнее» в архивы?
Каждый файл в macOS может содержать расширенные атрибуты (xattrs) – дополнительную информацию, которую система использует для тегов, меток безопасности или, например, данных Spotlight (технологии поиска). Например, атрибут com.apple.metadata:kMDItemTextContentLanguage хранит язык текстового содержимого файла. При создании архива через стандартную утилиту tar macOS автоматически включает эти атрибуты, а также резервные файлы AppleDouble (те самые ._F), чтобы сохранить метаданные для файловых систем, которые не поддерживают xattrs.
Но Linux, особенно с ext4 или другими распространёнными ФС, не понимает эти атрибуты. При распаковке вы увидите ошибки вроде:
tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.apple.metadata:kMDItemTextContentLanguage'
А файлы ._F останутся в папке как мусор. Это не критично для работы, но раздражает и нарушает структуру данных.
Как создать «чистый» архив для Linux
Решений два: либо отключить добавление xattrs при создании архива, либо очистить уже существующий. Начнём с первого варианта, как наиболее правильного.
Шаг 1. Используйте правильные флаги в команде tar
В macOS (начиная с версий, где используется bsdtar) добавьте –disable-copyfile и –no-xattrs:
tar --disable-copyfile --no-xattrs -cvf archive.tar /путь/к/папке
Поясню, зачем нужны оба параметра:
- –disable-copyfile отключает использование macOS-специфичных функций (вроде копирования ресурсных вилок файлов, которые в Linux не нужны).
- –no-xattrs запрещает запись расширенных атрибутов в архив.
Если пропустить один из флагов, могут остаться артефакты. Например, без –disable-copyfile иногда создаются скрытые файлы ._ даже при отключённых xattrs.
Шаг 2. Проверьте архив перед отправкой
Убедиться, что в архиве нет лишних элементов, можно так:
tar -tvf archive.tar
Если в списке есть файлы, начинающиеся на ._, или строки с LIBARCHIVE.xattr, значит, флаги не сработали. Пересоздайте архив, внимательно проверив синтаксис команды.
Шаг 3. Альтернатива: очистка существующего архива
Если архив уже создан без нужных флагов, удалить xattrs и ._ файлы можно на Linux:
tar -xf archive.tar --transform='s/._//' --exclude='._*'
Но это не всегда надёжно. Лучше сразу правильно настраивать процесс архивации.
Дополнительная информация
Почему нельзя просто использовать GNU tar на macOS?
Теоретически можно установить GNU-версию tar через Homebrew:
brew install gnu-tar
gtar -cvf archive.tar /путь/к/папке
Она по умолчанию игнорирует xattrs. Но есть нюанс: если вы работаете с файлами, которые действительно требуют сохранения атрибутов (например, для резервного копирования внутри экосистемы Apple), такой метод не подойдёт.
Что делать, если ошибки всё равно возникают?
Иногда проблемы сохраняются из-за скрытых файлов .DS_Store или других служебных данных macOS. В этом случае перед архивацией:
1. Удалите ненужные элементы:
find /путь/к/папке -name ".DS_Store" -delete
find /путь/к/папке -name "._*" -delete
2. Убедитесь, что в команде tar указаны оба ключа (–disable-copyfile и –no-xattrs).
Важные замечания
- Если вы используете Finder для создания архивов (через «Сжать» в контекстном меню), проблема с xattrs проявится гарантированно. Этот метод всегда добавляет метаданные.
- При копировании архивов через rsync или scp проверьте, не включена ли опция сохранения атрибутов (например, -X или -E для rsync).
В итоге, проблема с совместимостью tar между macOS и Linux – это не баг, а следствие различий в подходах к метаданным. Используя –disable-copyfile и –no-xattrs, вы создаёте нейтральные архивы, которые корректно распаковываются в любой системе. Если же вам критично сохранить xattrs для macOS-систем, рассматривайте форматы вроде zip или dmg, но помните: их поддержка в Linux может требовать дополнительных настроек.
Кстати, если вы часто обмениваетесь архивами между разными ОС, добавьте команду с нужными флагами в свой bash-профиль как алиас. Например:
alias tarclean='tar --disable-copyfile --no-xattrs -cvf'
Теперь команда “tarclean archive.tar folder” станет вашим стандартом.