Wie bekomme ich ein leeres Teerarchiv?

24

Ich mache ein RPM, in dem alles in der .spec-Datei enthalten ist (nicht fragen :-). Da rpmbuild eine "Source" -Datei benötigt, habe ich versucht, eine leere TAR-Datei zu erstellen. Wenn ich jedoch keine Dateinamen gebe, beschwert sich tar:

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

Wie erstelle ich eine wirklich leere TAR-Datei?

Sean Reifschneider
quelle
seine vor hier beantwortet: superuser.com/questions/133186/...
Rhyuk
3
Eigentlich, @Rhuyuk, hat es nicht. Dieser Beitrag ist jemand, der vergessen hat, einen Dateinamen aufzulisten, und die Antwort hat ihm klar gemacht, dass er ein anderes Argument übergeben muss, was zu einem nicht leeren Archiv führt. Aus diesem Grund habe ich den Titel dieser Frage geändert und diese Frage erstellt, die die Frage beantwortet , die der Titel dieser Frage gestellt hat.
Sean Reifschneider

Antworten:

24

Sie können GNU und BSD tar zwingen, ein leeres Archiv zu erstellen mit:

tar -cf tarfilename.tar -T /dev/null
Sean Reifschneider
quelle
Ja, die Option 'f' muss die letzte sein, da sie den Dateinamen angibt. Sie werden ein Archiv mit dem Namen T erstellen, es tritt jedoch trotzdem ein Fehler auf, wenn die Datei tarfilename.tar fehlt.
Lornix
1
Ein Grund, einen leeren Teer zu erstellen: die Erstellung von Teerskripten. Schritt 1: Erstellen Sie den Teer. Schritt 2: Fügen Sie nacheinander Dateien hinzu. Sie können dies mit der Option "Wenn die erste Datei erstellt wird, dann wird sie angehängt" tun, aber das ist nicht so reibungslos.
dpk
4
@dpk: Wenn ich verstehe, was Sie sagen, warum verwenden Sie nicht immer append? Anhängen erstellt die TAR-Datei, wenn sie noch nicht vorhanden ist. Sie müssen also nicht prüfen, ob es sich um die erste Datei handelt. Fügen Sie sie einfach an, und wenn es sich um die erste Datei handelt, wird sie von TAR erstellt.
Sean Reifschneider
1
@ SeanReifschneider Es sieht so aus, als würde das gut funktionieren. Nett.
dpk
1
@SeanReifschneider: +1 für den Hinweis, dass im Anfügemodus das Archiv für die erste Datei erstellt wird, sofern diese noch nicht auf der Festplatte vorhanden ist. Ich verwende den Befehl find, um tar im Append-Modus in einem Skript auszuführen, musste also die Archivdatei nicht vorher erstellen.
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
quelle
Endlich etwas, das in Solaris funktioniert !! Vielen Dank
AJPerez
4

Eine leere TAR-Datei ist nur eine Datei mit 10240 NUL Bytes. Um eine leere TAR-Datei zu erstellen, benötigen Sie nicht einmal eine, tarsondern können eine der folgenden Optionen verwenden:

$ 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
quelle
@KamilMaciorowski danke für deine Hinweise zur Verwendung von dd! Ich habe etwas Neues gelernt! Zur Beantwortung der richtigen Frage: Der Titel fragt zwar "wie man Tar erzwingt", aber beim Lesen des Fragetextes wird klar, dass OP tatsächlich eine leere Tar-Datei will und es keine Rolle spielen sollte, wie.
josch
Ich habe die Frage bearbeitet.
Kamil Maciorowski
3

Ich konnte ein leeres Archiv erstellen, indem ich eine einzelne Datei archivierte und dann die Datei aus dem Archiv löschte.

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

Das funktioniert bei mir.

Lornix
quelle
2
Ich kann überprüfen, ob mit GNU tar die erwartete 10-KB-Datei aller NUL-Zeichen erzeugt wird.
Sean Reifschneider