web-dev-qa-db-fra.com

Howto pipe: cp | tar | gzip sans créer de fichiers intermédiaires?

Quelqu'un peut-il me dire s'il est possible de pipe | cela sans avoir à créer un fichier physique entre A et B.tar.gz?

C'est ce que j'essaie de faire:

  1. Déposer un
  2. Renommer A en B
  3. Tar B.tar
  4. gzip -9 B.tar.gz

Donc par exemple:

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

Les exemples suivants peuvent être utilisés pour éviter de créer des fichiers intermédiaires:

goudron avec gzip:

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

gzip sans goudron:

gzip -9c A > B.gz

goudron sans gzip:

tar cf B.tar A

Renommer (déplacer) A en B premier n’a aucun sens pour moi. Si cela est prévu, mettez simplement un mv A B && avant l'une des commandes ci-dessus et échangez A avec B.

Exemple avec tar et gzip:

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

38
speakr

Cela dépend de votre version de tar

Si vous avez la version qui prend en charge les transformations de membre (--transform ou --xform), vous pouvez simplement faire

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

le | gzip -9> B.tar.gz peut être évité si votre tar prend en charge l'option -z

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

Si votre version de tar ne prend pas en charge --transform, vous devrez simplement copier le fichier en premier, par exemple.

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

Cependant, si vous ne compressez qu'un fichier, pourquoi ne pas sauter la partie tar à la fois et ne faire que

cat A | gzip -9 > B.gz
6
Bob Vale

Si vous utilisez cp pour créer une copie avec un nom/emplacement différent, incluez simplement le chemin complet/final souhaité lors de la création de votre fichier .gzip terminé:

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