我最近意识到 RPM 软件包几年前从 gzip 压缩转变为 xz 压缩。我需要检查我拥有的 RPM 包的压缩类型。我还需要检查我的系统在尝试解压 RPM 文件时考虑的压缩类型。
我在做什么:
XZ_OPT='-T0 -9 -vv' tar -vvcJf ~/backup.tar.xz ...FILES
Run Code Online (Sandbox Code Playgroud)
我怀疑是否tar
真的通过了给定的选项,我已经尝试过这些事情:
-vv
in XZ_OPT
,但xz
输出中没有消息,也没有--verbose
ps aux | grep xz
用来查看是否tar
会为spawn
另一个进程xz
,但我没有看到tar
创建任何进程。XZ_OPT
环境真的有用吗?如何验证?xz
在tar
执行过程中找不到进程?难道tar
真的产卵过程来压缩文件?$ xz --version
xz (XZ Utils) 5.2.5
liblzma 5.2.5
$ tar --version
bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6
Run Code Online (Sandbox Code Playgroud) 假设我有四个非常大的文本文件,都用 xz 压缩。
file1.log.xz
file2.log.xz
file3.log.xz
file4.log.xz
Run Code Online (Sandbox Code Playgroud)
我想做的是将这四个文件的未压缩内容连接成一个新文件file.xz
。问题是,我希望不必通过中间文件。
这些文件是非常大的日志文件,大小为千兆字节。压缩后,它们小于 100MB,但如果我要扩展所有四个文件然后重新连接,我至少需要 30GB 的存储空间来存储未压缩的文件。当然,我可以将cat
所有未压缩的文件xz
重新压缩:
cat file1.log file2.log file3.log file4.log | xz -ve9 - > newfile.log.xz
Run Code Online (Sandbox Code Playgroud)
我知道如何在没有中间件的情况下在命令行中连接两个文件,假设一个未压缩,一个已压缩:
xz -d -c file2.log.xz | cat file1.log - | xz -ve9 - > files1and2.log.xz
Run Code Online (Sandbox Code Playgroud)
但这仅适用于一个文件,其中之一必须已经解压缩。
我不确定我是否可以cat
将各种 .xz 文件放在一起 - 让我们假设它们可能已经用不同的参数进行了压缩。
在更高的层次上,可以问这个问题本身:您能否获取多个(超过两个)命令的输出,连接这些输出,并将它们通过管道传输到另一个进程而无需中间文件?(假设场景:假设我正在使用输出到 stdout 的脚本对所有四个非常大的文件进行某种处理,并希望将输出放入另一个压缩文件中。)
是否可以仅使用 shell 命令来执行此操作?
我想加快我的归档操作,我通常会进行 23 GiB(一张蓝光)备份。
我发现了这个:How to do Large fileparallel Encryption using GnuPG and GNU parallel?
因为我根本不理解这段代码(从未使用过parallel
):
tar --create --format=posix --preserve-permissions --same-owner --directory $BASE/$name --to-stdout . |
parallel --pipe --recend '' --keep-order --block-size 128M "xz -9 --check=sha256 |
gpg --encrypt --recipient $RECIPIENT;echo bLoCk EnD" |
pv > $TARGET/$FILENAME
Run Code Online (Sandbox Code Playgroud)
我想问一下有没有人可以帮我解析一下。谢谢。
我知道如何使用 tar 压缩带有 xz 的目录,但是是否可以使用 xz 而不使用 tar 来压缩目录?
如果我尝试:
xz -z myDir
Run Code Online (Sandbox Code Playgroud)
然后返回以下错误:
xz: myDir: Is a directory, skipping
Run Code Online (Sandbox Code Playgroud)