Створення tar-архіву каталогу, крім прихованих файлів?


17

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

календар_фінал /._ стиль.css

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

Як бачите, є дві версії одного файлу. Це стосується кожного файлу, і їх багато. Як я виключаю тимчасові файли з префіксом ._ з архіву tar?


Це може допомогти: unix.stackexchange.com/questions/2213/…
tshepang

Це не тимчасові файли, але являють собою метадані файлової системи OS X (якщо я не помиляюся, вони включають мітки Finder, тип і код творців, розширені атрибути тощо). Ці файли не існують до створення тарінгу в OS X. Можливі відповіді залежать від того, чи перебуваєте ви в OS X / HFS + чи іншій системі.
Даніель Бек

Відповіді:


33

Ви написали в коментарі, що працюєте в системі Mac OS X. Це важлива підказка до мети цих ._*файлів.

Ці ._*записи в архіві - це фрагменти даних AppleDouble, які містять додаткову інформацію, пов'язану з відповідним файлом (той, що не має ._префікса). Їх генерує сімейство функцій копіювального файлу (3) для Mac OS X (3) . Краплі AppleDouble зберігають дані контролю доступу (ACL) та розширені атрибути (як правило, прапори Finder та "вилки ресурсів", але для зберігання будь-яких даних можна використовувати xattrs).

bsdtarСистематизовані інструменти архіву Mac OS X (також позначені як 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 --versionдає тут GNU 1,23.
Фредерік Дьюердт

1
Ці файли є метаданими файлової системи в OS X і не існують до запуску tar, тому, ймовірно, не можна цього виключити. Вони включені для відновлення метаданих файлів OS X при розпакуванні архіву на іншому Mac.
Даніель Бек

Працює для мене. Рекомендую використовувати, tar vzcf ...щоб побачити, чи були включені якісь неправильні файли.
stribika

@stribika Він швидше за все працює в ОС 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

Цікаво ... Я не знав про Pax.
габе.

2

Станом на bsdtar 3.0.3 - libarchive 3.0.3(а можливо, і раніше) в bsdtarкоманді, що викликається --disable-copyfileпридушення створення ._файлів, існує новий (специфічний для Mac OS X) варіант . Старіші версії 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.