Comment obtenir une archive tar vide?

24

Je fais un RPM dans lequel tout est contenu dans le fichier .spec (ne demandez pas :-). rpmbuild nécessite un fichier "Source", donc j'essayais de créer un fichier tar vide. Cependant, si je ne donne aucun nom de fichier, tar se plaint:

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

Comment créer un fichier tar vraiment vide?

Sean Reifschneider
la source
il a été répondu avant ici: superuser.com/questions/133186/…
Rhyuk
3
En fait, @Rhuyuk, ce n'est pas le cas. Ce message est quelqu'un qui a oublié de répertorier un nom de fichier, et la réponse l'a aidé à réaliser qu'il devait passer un autre argument, ce qui entraîne une archive non vide. Voilà pourquoi je l' ai changé le titre de cette question, et a créé cette question, qui DOES réponse ce que le titre de cette question demandait.
Sean Reifschneider

Réponses:

24

Vous pouvez forcer GNU et BSD tar à créer une archive vide avec:

tar -cf tarfilename.tar -T /dev/null
Sean Reifschneider
la source
ya, l'option 'f' doit être la dernière, car elle spécifie le nom du fichier. Vous allez créer une archive nommée T, mais cela entraînera une erreur sur le fichier tarfilename.tar manquant de toute façon.
lornix
1
Une raison de créer un tar vide: création tar tarée. Étape 1: créez le goudron. Étape 2: ajoutez les fichiers un par un. Vous pouvez le faire avec un "si premier fichier puis créez autre chose puis ajoutez" mais ce n'est pas aussi fluide.
dpk
4
@dpk: Si je comprends ce que vous dites, pourquoi n'utilisez-vous pas toujours append? Append créera le fichier tar s'il n'existe pas déjà, vous n'avez donc pas besoin de vérifier s'il s'agit du premier fichier, il suffit de l'ajouter et s'il s'agit du premier fichier tar le créera.
Sean Reifschneider
1
@SeanReifschneider Il semble que cela fonctionnerait bien. Agréable.
dpk
1
@SeanReifschneider: +1 pour l'indication que le mode d'ajout crée l'archive pour le premier fichier s'il n'est pas déjà sur le disque. J'utilise la commande find pour exécuter tar en mode ajout dans un script, donc je n'avais pas besoin de créer le fichier d'archive au préalable.
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
la source
Enfin quelque chose qui fonctionne dans Solaris !! Merci beaucoup
AJPerez
4

Un fichier tar vide est juste un fichier contenant 10240 octets NUL. Donc, pour créer un fichier tar vide, vous n'avez même pas besoin, tarmais vous pouvez utiliser l'un des deux:

$ 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
la source
@KamilMaciorowski merci pour vos conseils sur l'utilisation de dd! J'ai appris quelque chose de nouveau! A propos de la réponse à la bonne question: Le titre demande en effet "comment forcer tar" mais en lisant le texte de la question, il devient clair que OP veut en fait un fichier tar vide et peu importe comment.
josch
Je suis allé de l'avant et j'ai édité la question.
Kamil Maciorowski
3

J'ai pu créer une archive vide en archivant un seul fichier, puis en supprimant le fichier de l'archive.

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

Cela fonctionne pour moi.

lornix
la source
2
Je peux vérifier qu'avec GNU tar cela produira le fichier 10K attendu de tous les caractères NUL.
Sean Reifschneider du