Créez un tar.xz en une seule commande

159

J'essaye de créer une .tar.xzarchive compressée en une seule commande. Quelle est la syntaxe spécifique pour cela?

J'ai essayé tar cf - file | xz file.tar.xz, mais cela ne fonctionne pas.

George K.
la source

Réponses:

241

Utilisez l' -Joption de compression pour xz. Et n'oubliez pas de man tar:)

tar cfJ <archive.tar.xz> <files>

Modifier le 10/08/2015:

Si vous passez les arguments tar avec des tirets (ex: tar -cfpar opposition à tar cf), alors l' -foption doit venir en dernier , car elle spécifie le nom du fichier (merci à @ABB pour l'avoir signalé!). Dans ce cas, la commande ressemble à:

tar -cJf <archive.tar.xz> <files>

la source
5
l'ajout và la commande commutateurs ( tar -cJvf) pour être détaillé montre les fichiers ajoutés à l'archive.
Stuart Cardall
7
Étant donné que la commande est importante avec le tableau de bord, il est probablement préférable de supposer que la commande est toujours importante et de mettre le fdernier, même sans le tiret.
mwfearnley
1
Est-il possible de passer des paramètres xz comme -e (--extended)? Apparemment, il n'utilisera pas étendu par défaut.
chmike
3
tarsur macOS semble prendre en charge -Jmais la fonctionnalité n'est pas donnée dans la page de manuel. J'ai dû le chercher ici. Bien qu'ils mentionnent XZ dans la section sur --options...
cbarrick
1
@chmike Utilisez la variable d'environnement XZ_OPT. Par exemple, XZ_OPT = "- 9e -T0".
Dzenly
50

Switch -Jne fonctionne que sur les systèmes plus récents. La commande universelle est:

Pour créer une archive .tar.xz

tar cf - directory/ | xz -z - > directory.tar.xz

Explication

  1. tar cf - directorylit le répertoire / et commence à le mettre au format TAR. La sortie de cette opération est générée sur la sortie standard.

  2. | conduit la sortie standard vers l'entrée d'un autre programme ...

  3. ... ce qui se trouve être xz -z -. XZ est configuré pour compresser ( -z) l'archive à partir de l'entrée standard ( -).

  4. Vous redirigez la sortie xzvers le tar.xzfichier.

Wojciech Adam Koszek
la source
16
-fne signifie pas «à partir du fichier» lorsqu'il est transmis à xz. Au lieu de cela, il est l'abréviation de --force(voir xz (1) pour plus de détails), et il est préférable de ne pas l'utiliser sauf si nécessaire.
Eliah Kagan
@EliahKagan Fixe. Merci.
Wojciech Adam Koszek
2
Pour utiliser la compression multithread, l'option -T0 peut être utilisée:tar cf - directory/ | xz -z -T0 - > directory.tar.xz
oidualc
Un autre avantage est que vous pouvez facilement spécifier le niveau de compression ou toute autre option de xz sur la ligne de commande. Par exemple, si vous souhaitez accélérer la compression et ne vous souciez pas beaucoup de la taille que vous pouvez utiliser -1 -T0ou des -0 -T0options, ce qui vous donnera généralement toujours un fichier plus petit que gzip dans un temps comparable ou plus rapide, alors que la valeur par défaut -6est considérablement plus lente que gzip.
fgwaller
38

Si vous aimez le mode pipe, c'est la solution la plus propre:

tar c some-dir | xz > some-dir.tar.xz

Il n'est pas nécessaire de mettre l' foption pour traiter les fichiers, puis de l'utiliser -pour spécifier que le fichier est l'entrée standard. Il n'est pas non plus nécessaire de spécifier l' -zoption pour xz, car elle est par défaut.

Cela fonctionne avec gzipet bzip2aussi:

tar c some-dir | gzip > some-dir.tar.gz

ou

tar c some-dir | bzip2 > some-dir.tar.bz2

La décompression est également assez simple:

xzcat tarball.tar.xz | tar x
bzcat tarball.tar.bz2 | tar x
zcat tarball.tar.gz | tar x

Si vous n'avez que des tararchives, vous pouvez utiliser cat:

cat archive.tar | tar x

Si vous avez besoin de lister uniquement les fichiers, utilisez tar t.

Rafael van Horn
la source
8

Utilisation des options de compression xz

Si vous souhaitez utiliser des options de compression pour xz, ou si vous utilisez tarsur MacOS, vous voudrez probablement éviter la tar -cJfsyntaxe.

Selon man xz, la façon de procéder est:

tar cf - baz | xz -4e > baz.tar.xz

Parce que j'ai aimé le format de Wojciech Adam Koszek , mais pas les informations:

  1. c crée une nouvelle archive pour les fichiers spécifiés.
  2. flit dans un répertoire (mieux vaut mettre cette seconde car -cf! = -fc)
  3. - sorties vers la sortie standard
  4. | conduit la sortie vers la commande suivante
  5. xz -4eappels xzavec l' -4eoption de compression. (égal à -4 --extreme)
  6. > baz.tar.xz dirige le fichier taré et compressé vers baz.tar.xz

-4eest, utilisez vos propres options de compression. Je l' utilise souvent -kpour --keeple fichier d' origine et -9pour la compression vraiment lourd. -zà définir manuellement xzsur zip, bien qu'il soit par défaut zipping si ce n'est pas indiqué autrement.

Pour décompresser et décompresser

Pour faire écho à Rafael van Horn , pour décompresser et décompresser (voir note ci-dessous):

xz -dc baz.tar.xz | tar x

Remarque: contrairement à la réponse de Rafael , utilisez à la xz -dcplace de catxz. La documentation le recommande au cas où vous l'utiliseriez pour la création de scripts. Mieux vaut avoir l'habitude d'utiliser -dou --decompressplutôt unxzque d'utiliser . Cependant, si vous le devez, utiliser ces commandes à partir de la ligne de commande est très bien.

Connor
la source
Une raison particulière pour ne pas utiliser la tar -cJfsyntaxe sur MacOS? Juste curieux, parce que je faisais ça tout à l'heure et que ça semblait marcher.
Lo-Tan le
2
@ Lo-Tan Cela fonctionne si vous avez du goudron. Quand je l'utilisais, je n'avais pas la bonne version de tar donc ça n'a pas fonctionné pour moi. Je voulais également utiliser les options de compression pour xz, ce que vous ne pouvez pas faire si vous utilisez tar. De plus, la syntaxe de la tuyauterie est plus facile à retenir pour moi, donc j'ai tendance à l'utiliser. Mais à chacun son propre
Connor
4

Essaye ça: tar -cf file.tar file-to-compress ; xz -z file.tar

Remarque:

  1. tar.gz et tar.xz ne sont pas identiques; xz offre une meilleure compression.
  2. N'utilisez pas de pipe | car cela exécute les commandes simultanément. Utiliser ;ou &exécuter des commandes l'une après l'autre.
Jhim Preston
la source
+1 Sur RHEL 5.10, je ne vois pas d' Joption, mais cela fonctionne. Je pense que vous avez besoin de RHEL6.
Brian
2
Pourquoi ne pas ajuster les commandes pour diriger la sortie de tar vers xz?
mwfearnley
@mwfearnley Je pense que la note est simplement pour souligner que les commandes doivent être exécutées séquentiellement. Étant donné que le nom de fichier est utilisé dans les deux commandes, ils n'écriront ni ne liront les données de la sortie ou de l'entrée standard. Si vous utilisez la commande sans spécifier le nom de fichier, ils peuvent être chaînés, comme tar -c file-to-compress | xz -z > file.tar.xz.
Jack Q
L'utilisation &ne lancera pas une commande l'une après l'autre. Au lieu de cela, il lancera le premier en tant que processus d'arrière-plan.
Luis Lavaire