Як отримати порожній архів дьогтю?


24

Я роблю RPM, у якому все міститься у .spec-файлі (не питайте :-). rpmbuild вимагає файлу "Джерело", тому я намагався створити порожній файл tar. Однак, якщо я не даю жодних імен файлів, тар скаржиться:

tar: Cowardly refusing to create an empty archive
Try `tar --help' or `tar --usage' for more information.

Як створити справді порожній файл tar?


його відповіді раніше тут: superuser.com/questions/133186/…
Rhyuk

3
Власне, @Rhuyuk, це не так. Цей пост є тим, хто забув перелічити ім'я файлу, і відповідь допомогла їм зрозуміти, що їм потрібно пройти ще один аргумент, в результаті чого не порожній архів. Ось чому я змінив назву цього питання і створив це запитання, яке НЕ відповідає тому , що задав заголовок цього питання.
Шон Рейфшнайдер

Відповіді:


24

Ви можете змусити GNU та BSD tar створити порожній архів за допомогою:

tar -cf tarfilename.tar -T /dev/null

ya, опція 'f' повинна бути останньою, оскільки вона визначає назву файлу. Ви збираєтесь створити архів з назвою T, але він все одно помилиться у відсутньому файлі tarfilename.tar.
lornix

1
Однією з причин створення порожнього дьогтю: створення скрипту на основі tar. Крок 1: Створіть дьоготь. Крок 2. Додайте файли по одному. Це можна зробити за допомогою "якщо перший файл, тоді створити інше, то додати", але це не так гладко.
dpk

4
@dpk: Якщо я зрозумів, що ти говориш, чому ти просто не завжди використовуєш додавання? Додаток створить файл tar, якщо він ще не існує, тому вам не потрібно перевіряти, чи це перший файл, просто додайте і чи це перший файл tar створить його.
Шон Рейфшнайдер

1
@SeanReifschneider Схоже, це буде добре. Приємно.
dpk

1
@SeanReifschneider: +1 для підказки, що режим додавання створює архів для першого файлу, якщо він ще не є на диску. Я використовую команду find для виконання tar в режимі додавання в сценарії, тому не потрібно було створювати архівний файл заздалегідь.
ГуруМ

8

BSD: tar cvf empty.tar --from-file /dev/null

GNU (Linux): tar cvf empty.tar --files-from /dev/null

Solaris: tar cvf empty.tar -I /dev/null


Нарешті щось, що працює в Solaris !! Велике спасибі
AJPerez

4

Порожній файл tar - це лише файл із 10240 байтами NUL. Отже, щоб створити порожній файл tar, вам навіть не потрібно, tarале натомість ви можете використовувати будь-яке з цих:

$ head --bytes=10240 /dev/zero > empty.tar
$ truncate --size=10240 empty.tar
$ fallocate --length=10240 empty.tar
$ dd if=/dev/zero bs=10240 count=1 iflag=fullblock > empty.tar
$ dd if=/dev/zero bs=1 count=10240 > empty.tar

@KamilMaciorowski дякуємо за ваші підказки щодо використання DD! Я дізнався щось нове! Про відповідь на правильне запитання: Заголовок справді запитує "як змусити тар", але, читаючи текст запитання, стає зрозуміло, що ОП насправді хоче порожній файл tar, і не має значення, як.
Джош

Я пішов вперед і відредагував питання.
Каміль Маціоровський

3

Мені вдалося створити порожній архів, заархівувавши один файл, потім видаливши файл з архіву.

tar cf empty.tar somefile                   # creates archive
tar --delete -f empty.tar somefile          # remove the file
tar tf empty.tar                            # list contents of archive

Це працює для мене.


2
Я можу переконатися, що за допомогою гудрону GNU це створить очікуваний 10K файл усіх символів NUL.
Шон Рейфшнайдер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.