Создать архив tar из директории, кроме скрытых файлов?


17

Я хочу создать tar-архив определенного каталога (с его подкаталогами, конечно). Но когда я делаю это, используя команду tar, я получаю список файлов, которые были включены, например:

календарь_финал /._ style.css

calendar_final / style.css

Как видите, есть две версии одного и того же файла. Это касается каждого файла, а их много. Как исключить временные файлы с префиксом ._ из архива tar?


Это может помочь: unix.stackexchange.com/questions/2213/…
tshepang

Это не временные файлы, они представляют метаданные файловой системы OS X (если я не ошибаюсь, они включают метки Finder, коды типов и создателей, расширенные атрибуты и т. Д.). Эти файлы не существуют до создания tar в OS X. Возможные ответы зависят от того, используете ли вы OS X / HFS + или другую систему.
Даниэль Бек,

Ответы:


33

Вы опубликовали в комментарии, что вы работаете в системе Mac OS X. Это важный ключ к цели этих._* файлов.

Эти ._*записи архива являются порциями данных AppleDouble, которые содержат дополнительную информацию, связанную с соответствующим файлом (который без ._префикса). Они генерируются специфичным для Mac OS X копируемым файлом (3) . В двоичных объектах AppleDouble хранятся данные контроля доступа (ACL) и расширенные атрибуты (обычно это флаги Finder и «ветки ресурсов», но xattrs можно использовать для хранения любых данных).

Системные инструменты архивирования Mac OS X ( bsdtarтакже обозначенные как tar) gnutar, иpax ) сгенерируют элемент ._*архива для любого файла, с которым связана любая расширенная информация; в «разархивированном» режиме они также будут декодировать эти элементы архива и применять полученную расширенную информацию к связанному файлу. Это создает архив «полной точности» для использования в системах Mac OS X путем сохранения и последующего извлечения всей информации, которую может хранить файловая система HFS +.

Соответствующие инструменты архивирования в других системах не знают, как обрабатывать эти ._*файлы, поэтому они распаковываются как обычные файлы. Поскольку такие файлы довольно бесполезны в других системах, они часто рассматриваются как «ненужные файлы». Соответственно, если система, не относящаяся к Mac OS X, генерирует архив, включающий обычные файлы, которые начинаются с ._, инструменты разархивирования Mac OS X будут пытаться декодировать эти файлы как расширенную информацию.

Однако существует недокументированный (?) Способ заставить поставляемые системой архиваторы Mac OS X вести себя так же, как в других системах Unixy: переменная среды COPYFILE_DISABLE. Установка этой переменной (любое значение, даже пустая строка) не позволит архиваторам создавать ._*элементы архива для представления любой расширенной информации, связанной с архивированными файлами. Его присутствие также не позволит архиваторам пытаться интерпретировать таких участников архива как расширенную информацию.

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

Вы можете установить эту переменную в файле инициализации вашей оболочки, если хотите работать чаще, чем нет.

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

Затем, когда вам нужно повторно включить функцию (чтобы сохранить / восстановить расширенную информацию), вы можете «сбросить» переменную для отдельных команд:

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

Архиваторы в Mac OS X 10.4 также делают нечто подобное, хотя они используют другую переменную среды: COPY_EXTENDED_ATTRIBUTES_DISABLE


кто-нибудь видел это не работает? Я пробовал это решение на Yosemite, и когда я распаковываю архив на AIX, каталоги PaxHeader все еще генерируются
conorgriffin

5

Это должно работать:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'

Я думал, что это работает, но на самом деле, когда я распаковал архив, я обнаружил, что они были включены: /

Странно, какую версию tar вы используете? tar --versionдает GNU 1.23 здесь.
Фредерик Дьюердт

1
Эти файлы являются метаданными файловой системы в OS X и не существуют до запуска tar, поэтому, вероятно, не могут быть исключены таким образом. Они включены, чтобы позволить восстановить метаданные файла OS X при распаковке в архиве на другом Mac.
Даниэль Бек,

Работает для меня. Я рекомендую использовать, tar vzcf ...чтобы увидеть, если какие-либо неправильные файлы были включены.
стрибика

@stribika Он, скорее всего, на OS X. Смотрите мой комментарий по этому вопросу. Файлы не могут быть исключены, так как они не существуют вне архива tar.
Даниэль Бек

2

Фредерик Дьюердт дал решение, которое работает на GNU tar (используется в Linux, Cygwin, FreeBSD, OSX, возможно, других), но не на других системах, таких как NetBSD, OpenBSD или Solaris.

POSIX не определяет tarкоманду (потому что она слишком сильно различается в разных вариантах Unix) и вводит paxкоманду вместо этого. Опция -wозначает создание архива ( -rизвлечения) и -xвыбор формата архива. Опция -s '!BRE!!'исключает все файлы, путь которых соответствует базовому регулярному выражению BRE.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar

Интересно ... Я не знал о Пакс.
таращиться

2

Начиная с bsdtar 3.0.3 - libarchive 3.0.3(и, возможно, ранее), есть новая (специфичная для Mac OS X) опция для bsdtarкоманды, вызываемой --disable-copyfileдля подавления создания ._файлов. Старые версии tarне имеют --disable-copyfileопции, но установка переменной среды COPYFILE_DISABLE=1должна работать.


С bsdtar 2.8.3 - libarchive 2.8.3из не документирована , но тем не менее доступны. 10.7.5--disable-copyfile
Стефан Шмидт

0

Следуй этим шагам:

  1. Найдите все ._файлы и перечислите их, используя, -lsчтобы вы могли видеть все ._файлы и, наконец, удалить их.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Создать архив .tar используя.

    tar -cvf name.tar /path/to/directory
    
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.