Como obter um arquivo tar vazio?


24

Estou criando um RPM no qual tudo está contido no arquivo .spec (não pergunte :-). O rpmbuild requer um arquivo "Source", então eu estava tentando criar um arquivo tar vazio. No entanto, se eu não der nenhum nome de arquivo, o tar reclama:

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

Como crio um arquivo tar verdadeiramente vazio?


já foi respondido aqui: superuser.com/questions/133186/…
Rhyuk

3
Na verdade, @Rhuyuk, não está. Essa postagem é alguém que esqueceu de listar um nome de arquivo e a resposta os ajudou a perceber que precisavam passar outro argumento, resultando em um arquivo não vazio. É por isso que eu mudei o título desta questão, e criou esta questão, que FAZ resposta que o título dessa questão estava pedindo.
Sean Reifschneider

Respostas:


24

Você pode forçar o GNU e o BSD tar a criar um arquivo vazio com:

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

A opção 'f' deve ser a última, pois especifica o nome do arquivo. Você criará um arquivo chamado T, mas, de qualquer maneira, ocorrerá um erro ao perder o arquivo tarfilename.tar.
Lornix

11
Um motivo para criar um tar vazio: criação de tar com script. Etapa 1: Crie o alcatrão. Etapa 2: adicione arquivos um por um. Você pode fazer isso com um "se primeiro arquivo, depois criar outro e depois anexar", mas isso não é tão bom.
DPK

4
@dpk: Se eu entendo o que você está dizendo, por que você nem sempre usa o acréscimo? Anexar criará o arquivo tar se ele ainda não existir, portanto você não precisa verificar se é o primeiro arquivo, basta anexá-lo e se é o primeiro arquivo tar o criará.
Sean Reifschneider

11
@SeanReifschneider Parece que isso funcionaria bem. Agradável.
precisa

11
@SeanReifschneider: +1 para a dica de que o modo de acréscimo cria o arquivo para o primeiro arquivo, se ele ainda não estiver no disco. Estou usando o comando find para exec tar no modo de acréscimo em um script, portanto, não é necessário criar o arquivo morto anteriormente.
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


Finalmente, algo que funciona no Solaris !! Muito obrigado
AJPerez 23/11

4

Um arquivo tar vazio é apenas um arquivo com 10240 NUL bytes. Portanto, para criar um arquivo tar vazio, você nem precisa, tarmas pode usar um destes:

$ 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 obrigado por suas dicas sobre o uso de dd! Eu aprendi algo novo! Sobre responder à pergunta correta: O título realmente pergunta "como forçar o tar", mas ao ler o texto da pergunta, fica claro que o OP realmente deseja um arquivo tar vazio e não deve importar como.
josch 15/01

Fui em frente e editei a pergunta.
Kamil Maciorowski 15/01

3

Consegui criar um arquivo vazio arquivando um único arquivo e excluindo o arquivo do arquivo.

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

Isso funciona para mim.


2
Eu posso verificar que, com o GNU tar, isso produzirá o arquivo 10K esperado de todos os caracteres NUL.
Sean Reifschneider
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.