Tubo de instruções: cp | alcatrão | gzip sem criar arquivos intermediários?


31

Alguém pode me dizer se é possível canalizar | isso sem ter que criar um arquivo físico em qualquer lugar entre A e B.tar.gz?

Isto é o que estou tentando fazer:

  1. Arquivo A
  2. Renomeie A para B
  3. Tar B.tar
  4. gzip -9 B.tar.gz

Então, por exemplo:

cp A B | tar cvf - B | gzip -9 B.tar.gz
gzip  pipe  tar 

por que você gostaria de cantar cp A B?
Dor

1
renomear é mv.
Karoly Horvath

3
Por favor, explique por que você gostaria de copiar Aa Bprimeira.
Speakr

Respostas:


42

Os exemplos a seguir podem ser usados ​​para evitar a criação de arquivos intermediários:

alcatrão com gzip:

tar cf - A | gzip -9 > B.tar.gz

gzip sem alcatrão:

gzip -9c A > B.gz

alcatrão sem gzip:

tar cf B.tar A

Renomear (mover) Apara o Bprimeiro não faz sentido para mim. Se isso for pretendido, basta colocar um mv A B &&antes de qualquer um dos comandos acima e trocar Acom Bele.

Exemplo com tar e gzip:

mv A B && tar cf - B | gzip -9 > B.tar.gz


1
Isso está correto e deve ser marcado como tal. Você deve incluir um "-" depois de "tar" para a opção de canalização, caso contrário você obtém "tar: Covardamente se recusando a criar um arquivo vazio".
Adambean

6

Depende da sua versão do tar

Se você possui a versão que suporta transformações de membros (--transform ou --xform), pode simplesmente fazer

tar -c --transform=s/A/B/ A | gzip -9 > B.tar.gz

o | gzip -9> B.tar.gz pode ser evitado se o seu tar suportar a opção -z

tar -zcvf B.tar.gz --transform=s/A/B/ A

Se sua versão do tar não suportar --transform, você deverá copiar o arquivo primeiro, por exemplo,

 cp A B && tar -zcvf B.tar.gz B

No entanto, se você estiver compactando apenas um arquivo, por que não pular a parte do alcatrão todos juntos?

cat A | gzip -9 > B.gz

Eu usei cp como você fez no seu exemplo, mas de mudança de nome é mv

0

Se você estiver usando cppara fazer uma cópia com um nome / local diferente, inclua o nome do caminho completo / final desejado ao criar o arquivo .gzip completo:

tar -cvf existing.file | gzip -1 > ./newdirectory/newnamed.file.tgz

Isso não funciona, produz "tar: Cowardly recusando-se a criar um arquivo vazio".
Adambean

@ Adambean Talvez você queira usar tar -czf - some-folder > some-archive.tar.gz?
tsauerwein

1
@tsauerwein, sim, veja minha resposta para a resposta abaixo de 14 meses atrás ...
Adambean
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.