I am trying to create a .tar.xz compressed archive in one command. What is the specific syntax for that?
I have tried tar cf - file | xz file.tar.xz, but that does not work.
Use the -J compression option for xz. And remember to man tar :)
tar cfJ <archive.tar.xz> <files>
Edit 2015-08-10:
If you're passing the arguments to tar with dashes (ex: tar -cf as opposed to tar cf), then the -f option must come last, since it specifies the filename (thanks to @A-B-B for pointing that out!). In that case, the command looks like:
tar -cJf <archive.tar.xz> <files>
Switch -J only works on newer systems. Universal command is:
To make .tar.xz archive
tar cf - directory/ | xz -z - > directory.tar.xz
Explanation
tar cf - directoryreads directory/ and starts putting it to TAR format. Output of this operation is generated on the standard output.|pipes standard output to input of another program...... which happens to be
xz -zf -. XZ is configured to create (-z) the archive from file (-f) which happens to be standard input (-).You redirect the output from
xzto thetar.xzfile.
If you like the pipe mode, this is the most clean solution:
tar c some-dir | xz > some-dir.tar.xz
It's not necessary to put the f option in order to deal with files and then to use - to specify that the file is the standard input. It's also not necessary to specify the -z option for xz, because it's default.
It works with gzip and bzip2 too:
tar c some-dir | gzip > some-dir.tar.gz
or
tar c some-dir | bzip2 > some-dir.tar.bz2
Decompressing is also quite straightforward:
xzcat tarball.tar.xz | tar x
bzcat tarball.tar.bz2 | tar x
zcat tarball.tar.gz | tar x
If you have only tar archive, you can use cat:
cat archive.tar | tar x
If you need to list the files only, use tar t.
Using xz compression options
If you want to use compression options for xz, or if you are using tar on MacOS, you probably want to avoid the tar -cJf syntax.
According to man xz, the way to do this is:
tar cf - baz | xz -4e > baz.tar.xz
Because I liked Wojciech Adam Koszek's format, but not information:
ccreates a new archive for the specified files.freads from a directory (best to put this second because-cf!=-fc)-outputs to Standard Output|pipes output to the next commandxz -4ecallsxzwith the-4ecompression option. (equal to-4--extreme)> baz.tar.xzdirects the tarred and compressed file tobaz.tar.xz
where -4e is, use your own compression options.
I often use -k to --keep the original file and -9 for really heavy compression. -z to manually set xz to zip, though it defaults to zipping if not otherwise directed.
To uncompress and untar
To echo Rafael van Horn, to uncompress & untar (see note below):
xz -dc baz.tar.xz | tar x
Note: unlike Rafael's answer, use xz -dc instead of catxz. The docs recommend this in case you are using this for scripting. Best to have a habit of using -d or --decompress instead of unxz as well. However, if you must, using those commands from the command line is fine.
Try this: tar -cf file.tar file-to-compress ; xz -z file.tar
Note:
- tar.gz and tar.xz are not the same; xz provides better compression.
- Don't use pipe
|because this runs commands simultaneously. Using;or&executes commands one after another.
来源:https://stackoverflow.com/questions/18855850/create-a-tar-xz-in-one-command