Howto pipe: cp | alquitrán | gzip sin crear archivos intermedios?

31

¿Alguien puede decirme si es posible canalizar | esto sin tener que crear un archivo físico en cualquier lugar entre A y B.tar.gz?

Esto es lo que estoy tratando de hacer:

  1. Presentar un
  2. Cambiar el nombre de A a B
  3. Tar B.tar
  4. gzip -9 B.tar.gz

Así por ejemplo:

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

fuente
¿Por qué te gustaría hacer una tubería cp A B?
Dor
1
cambio de nombre es mv.
Karoly Horvath
3
Por favor, explique por qué le gustaría copiar Aa Bprimera.
hablante

Respuestas:

42

Los siguientes ejemplos se pueden usar para evitar crear archivos intermedios:

alquitrán con gzip:

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

gzip sin alquitrán:

gzip -9c A > B.gz

alquitrán sin gzip:

tar cf B.tar A

Renombrar (mover) Aa Bprimero no tiene sentido para mí. Si esto es así, simplemente coloque un mv A B &&antes de cualquiera de los comandos anteriores e intercambie Acon Bél.

Ejemplo con alquitrán y gzip:

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

hablador
fuente
1
Esto es correcto y debe marcarse como tal. Debe incluir un "-" después de "tar" para la opción canalizada; de lo contrario, obtendrá "tar: se niega cobardemente a crear un archivo vacío".
Adambean
6

Depende de tu versión de tar

Si tiene la versión que admite transformaciones de miembros (--transform o --xform), simplemente puede hacer

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

el | gzip -9> B.tar.gz se puede evitar si su tar admite la opción -z

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

Si su versión de tar no es compatible con --transform, primero tendrá que copiar el archivo, por ejemplo

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

Sin embargo, si solo está comprimiendo un archivo, ¿por qué no omitir la parte de alquitrán todos juntos y simplemente hacer

cat A | gzip -9 > B.gz
Bob Vale
fuente
He usado cp como lo hiciste en tu ejemplo, pero renombrar es mv
0

Si está utilizando cppara hacer una copia con un nombre / ubicación diferente, simplemente incluya el nombre de ruta completo / final que desea al crear su archivo .gzip completo:

tar -cvf existing.file | gzip -1 > ./newdirectory/newnamed.file.tgz
Huésped
fuente
Esto no funciona, produce "alquitrán: se niega cobardemente a crear un archivo vacío".
Adambean
@Adambean ¿Tal vez quieres usar tar -czf - some-folder > some-archive.tar.gz?
tsauerwein
1
@tsauerwein, sí, vea mi respuesta a la respuesta a continuación de hace 14 meses ...
Adambean