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

fonte
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

speakr
fonte
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
Bob Vale
fonte
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
Hóspede
fonte
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