Jak zdobyć puste archiwum tar?

24

Tworzę RPM, w którym wszystko jest zawarte w pliku .spec (nie pytaj :-). rpmbuild wymaga pliku „Source”, więc próbowałem utworzyć pusty plik tar. Jeśli jednak nie podam żadnych nazw plików, tar narzeka:

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

Jak utworzyć naprawdę pusty plik tar?

Sean Reifschneider
źródło
odpowiedziano wcześniej tutaj: superuser.com/questions/133186/…
Rhyuk
3
W rzeczywistości, @Rhuyuk, nie ma. Ten post jest kimś, kto zapomniał podać nazwę pliku, a odpowiedź pomogła im zrozumieć, że muszą przekazać kolejny argument, w wyniku czego niepuste archiwum. To dlatego zmieniłem tytuł to pytanie i stworzył to pytanie, co robi odpowiedź co tytuł to pytanie zadawał.
Sean Reifschneider,

Odpowiedzi:

24

Możesz zmusić tar GNU i BSD do utworzenia pustego archiwum za pomocą:

tar -cf tarfilename.tar -T /dev/null
Sean Reifschneider
źródło
ya, opcja „f” musi być ostatnia, ponieważ określa nazwę pliku. Zamierzasz utworzyć archiwum o nazwie T, ale i tak będzie to błąd w przypadku braku pliku tarfilename.tar.
lornix
1
Jednym z powodów utworzenia pustej tar: tworzenie skryptów tar. Krok 1: Utwórz smołę. Krok 2: Dodaj pliki jeden po drugim. Możesz to zrobić za pomocą „jeśli najpierw plik, a następnie utwórz inny, a następnie dołącz”, ale to nie jest tak płynne.
dpk
4
@dpk: Jeśli rozumiem, co mówisz, dlaczego po prostu nie zawsze używasz append? Append utworzy plik tar, jeśli jeszcze nie istnieje, więc nie musisz sprawdzać, czy jest to pierwszy plik, po prostu dołącz i jeśli jest to pierwszy plik tar, utworzy go.
Sean Reifschneider,
1
@SeanReifschneider Wygląda na to, że działałoby to dobrze. Miły.
dpk
1
@SeanReifschneider: +1 za wskazówkę, że tryb dołączania tworzy archiwum dla pierwszego pliku, jeśli nie jest on jeszcze na dysku. Używam polecenia find do wykonania tar w trybie dołączania w skrypcie, więc nie musiałem wcześniej tworzyć pliku archiwum.
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
źródło
Wreszcie coś, co działa w systemie Solaris !!
Wielkie
4

Pusty plik tar to tylko plik zawierający 10240 bajtów NUL. Aby utworzyć pusty plik tar, nie potrzebujesz nawet, tarale zamiast tego możesz użyć jednego z tych:

$ 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
źródło
@KamilMaciorowski dziękuję za podpowiedzi na temat korzystania z DD! Nauczyłem się czegoś nowego! O odpowiedzi na właściwe pytanie: tytuł rzeczywiście pyta „jak wymusić tar”, ale podczas czytania tekstu pytania staje się jasne, że OP rzeczywiście chce pusty plik tar i nie powinno to mieć znaczenia.
josch
Poszedłem do przodu i zredagowałem pytanie.
Kamil Maciorowski
3

Udało mi się utworzyć puste archiwum, archiwizując pojedynczy plik, a następnie usuwając go z archiwum.

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

To działa dla mnie.

lornix
źródło
2
Mogę zweryfikować, że z GNU tar spowoduje to wygenerowanie oczekiwanego pliku 10 KB wszystkich znaków NUL.
Sean Reifschneider