Как получить пустой архив tar?

24

Я делаю RPM, в котором все содержится в файле .spec (не спрашивайте :-). Для rpmbuild требуется файл «Source», поэтому я пытался создать пустой файл tar. Однако, если я не даю никаких имен файлов, tar жалуется:

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

Как мне создать действительно пустой файл tar?

Шон Рейфшнайдер
источник
Ответ на
3
На самом деле, @Rhuyuk, это не так. Этот пост - кто-то, кто забыл перечислить имя файла, и ответ помог им понять, что им нужно передать другой аргумент, что привело к непустому архиву. Вот почему я изменил название этого вопроса, и создал этот вопрос, который делает ответ , что задавало название этого вопроса.
Шон Рейфшнайдер

Ответы:

24

Вы можете заставить GNU и BSD tar создать пустой архив с помощью:

tar -cf tarfilename.tar -T /dev/null
Шон Рейфшнайдер
источник
да, опция 'f' должна быть последней, так как она указывает имя файла. Вы собираетесь создать архив с именем T, но в любом случае произойдет ошибка при отсутствии файла tarfilename.tar.
lornix
1
Одна из причин создания пустого tar: создание tar с помощью скриптов. Шаг 1: Создайте tar. Шаг 2: Добавьте файлы один за другим. Вы можете сделать это с помощью «если первый файл, затем создайте другое, затем добавьте», но это не так гладко.
дпк
4
@dpk: Если я понимаю, что вы говорите, почему бы вам не всегда использовать append? Append создаст файл tar, если он еще не существует, поэтому вам не нужно проверять, является ли это первый файл, просто добавьте его, и если это первый файл, то tar создаст его.
Шон Рейфшнайдер
1
@SeanReifschneider Похоже, это будет работать нормально. Ницца.
ДПК
1
@SeanReifschneider: +1 для подсказки, что в режиме добавления создается архив для первого файла, если его еще нет на диске. Я использую команду find для выполнения tar в режиме добавления в скрипте, поэтому мне не нужно было заранее создавать файл архива.
GuruM
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

Sild
источник
Наконец то, что работает в 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
josch
источник
@KamilMaciorowski спасибо за ваши советы об использовании дд! Я узнал что-то новое! Об ответе на правильный вопрос: заголовок действительно спрашивает «как заставить tar», но при чтении текста вопроса становится ясно, что OP на самом деле хочет пустой файл tar, и это не должно иметь значения, как.
josch
Я пошел дальше и отредактировал вопрос.
Камиль Мачоровский
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

Это работает для меня.

lornix
источник
2
Я могу проверить, что с помощью GNU tar это приведет к ожидаемому файлу 10K всех символов NUL.
Шон Рейфшнайдер