越来越多的tar
存档使用xz
基于 LZMA2的格式进行压缩,而不是传统的bzip2(bz2)
压缩。事实上,kernel.org于2013 年 12 月 27日晚发布了“再见 bzip2 ”公告,表明内核源代码将从此时起以 tar.gz 和 tar.xz 格式发布 - 并在网站主页上发布直接提供的是在tar.xz
.
是否有任何具体原因可以解释为什么会发生这种情况以及gzip
在这种情况下的相关性是什么?
在yum
RHEL Server 6.6 系统上安装软件包时,出现以下错误:
$ sudo yum install foo
Loaded plugins: product-id, rhnplugin, security, subscription-manager
This system is receiving updates from RHN Classic or RHN Satellite.
Setting up Install Process
Error: xz compression not available
Run Code Online (Sandbox Code Playgroud)
搜索引擎搜索表明该pyliblzma
包丢失。
我无法安装它,sudo yum install pyliblzma
因为我遇到了同样的xz compression not available
错误。
相反,我下载了 RPM 存档并通过rpm
以下方式安装了它:
$ wget http://download.fedoraproject.org/pub/epel/6/SRPMS/pyliblzma-0.5.3-3.el6.src.rpm
$ sudo rpm -ivh pyliblzma-0.5.3-3.el6.src.rpm
Run Code Online (Sandbox Code Playgroud)
好像没有安装成功;以下不返回任何结果:
$ rpm -qa | grep pyliblzma
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能正确安装pyliblzma
和修复xz compression not available
错误?
我有一个带有 gzip 文件的目录树,如下所示:
basedir/a/file.dat.gz
basedir/b/file.dat.gz
basedir/c/file.dat.gz
etc.
Run Code Online (Sandbox Code Playgroud)
如何使用单个命令将所有这些从 gzip 转换为 xz 而不将每个文件解压缩到磁盘?
带有解压到磁盘的简单的两行代码如下所示:
find basedir/ -type f -name '*.dat.gz' -exec gzip -d {} \;
find basedir/ -type f -name '*.dat' -exec xz {} \;
Run Code Online (Sandbox Code Playgroud)
第一个命令甚至可以更短: gunzip -r *
对于单个文件,即时转换很简单(尽管这不会替换 .gz 文件):
gzip -cd basedir/a/file.dat.gz | xz > basedir/a/file.dat.xz
Run Code Online (Sandbox Code Playgroud)
由于 gzip 和 xz 自己处理扩展,我想说:
gunzip -rc * > xz
Run Code Online (Sandbox Code Playgroud)
我看了find | xargs basename -s .gz { }
一点,但没有得到一个有效的解决方案。
我可以写一个shell脚本,但我觉得应该有一个简单的解决方案。
编辑
感谢所有已经回答的人。我知道我们都喜欢“永不失败的命令™”。所以,为了简单起见:
使用简单的find -exec …
我正在寻找具有任意大字典(和“块大小”)的压缩工具。让我通过例子来解释。
首先让我们创建 32MB 的随机数据,然后将其连接到自身以制作长度为 64MB 的两倍长度的文件。
head -c32M /dev/urandom > test32.bin
cat test32.bin test32.bin > test64.bin
Run Code Online (Sandbox Code Playgroud)
当然test32.bin
不可压缩,因为它是随机的,但前半部分和后半部分test64.bin
是一样的,所以应该可以压缩大约 50%。
首先让我们尝试一些标准工具。test64.bin 的大小正好是 67108864。
我们从中了解到 gzip 和 bzip2 永远不能压缩这个文件。然而,使用足够大的字典 xz 和 zstd 可以压缩文件,在这种情况下, zstd 做得最好。
但是,现在尝试:
head -c150M /dev/urandom > test150.bin
cat test150.bin test150.bin > test300.bin
Run Code Online (Sandbox Code Playgroud)
test300.bin 的大小正好是 314572800。让我们在最高设置下再次尝试最佳压缩算法。
在这种情况下,两个工具都不能压缩文件。
有没有一个工具可以有任意大的字典大小,所以它可以压缩像 test300.bin 这样的文件?
感谢评论和回答,结果证明 zstd 和 …
在当前的 Debian 测试机器上,我想使用 xz 而不是 GZip 来压缩日志文件。它具有较高的开箱即用压缩率,因此我希望使用它。
但是,每当我在 logrotate 配置中指定它时,logrotate 就会说它无法用于xz
压缩。它只是说该文件无法执行,即使它在系统和用户 shell 中的其他任何地方都可以工作。
有什么办法可以调试这个吗?
我可以在不解压缩的情况下检查存档的完整性吗,因为存档是 64GB。这是我旧笔记本电脑的备份,在我格式化旧笔记本电脑之前,我想验证备份,但解压缩和验证需要很长时间。那么有没有更快的方法呢?
在 Windows 中,默认情况下可以看到 zip 文件的压缩率,安装 WinRAR 后,它也支持此功能,但目前我使用的是 linux 并使用 lzma2 和 xz 作为容器压缩了一个文件,但如何在没有的情况下检查压缩率比较原始文件大小和压缩文件大小?甚至有可能吗?
我有一个在磁盘上写入跟踪的程序,并且大小变得非常大。通常,我使用以下命令。
./run output.txt
xz output.txt
Run Code Online (Sandbox Code Playgroud)
我可以在写入 output.txt 的同时管道 xz 吗?
我阅读了如何将所有文件从 gzip 动态转换为 xz(并递归地)?,但我不确定它是否适用于我的情况。
我正在使用 Red Hat Virtualization ( RHV ),它将所有文件记录在此目录中:
$ pwd
/var/log/vdsm
$ ls | column -c 80 | head -10
backup vdsm.log.34.xz vdsm.log.69.xz
import vdsm.log.35.xz vdsm.log.6.xz
mom.log vdsm.log.36.xz vdsm.log.70.xz
mom.log.1 vdsm.log.37.xz vdsm.log.71.xz
mom.log.2 vdsm.log.38.xz vdsm.log.72.xz
mom.log.3 vdsm.log.39.xz vdsm.log.73.xz
mom.log.4 vdsm.log.3.xz vdsm.log.74.xz
mom.log.5 vdsm.log.40.xz vdsm.log.75.xz
supervdsm.log vdsm.log.41.xz vdsm.log.76.xz
upgrade.log vdsm.log.42.xz vdsm.log.77.xz
Run Code Online (Sandbox Code Playgroud)
我已经使用&z*
等工具来查看&文件,但它似乎不处理压缩。zgrep
zcat
.gz
.Z
.xz
grep
浏览文件目录的简单方法是什么.xz
?
如果我运行这个命令:
XZ_OPT=-9 tar --xz -cvf files/compressed/xz/archive.tar.xz -C files/original/ .
Run Code Online (Sandbox Code Playgroud)
收到这条消息:
xz: (stdin): Cannot allocate memory
tar: files/compressed/lzma//archive.lzma: Wrote only 4096 of 10240 bytes
tar: Error is not recoverable: exiting now
Run Code Online (Sandbox Code Playgroud)
它是什么类型的内存?或者我如何设置它以使其工作。
编辑:(附加信息)
我要压缩的总文件大小:18.92M
Gzip Bzip2 ZIP - 工作正常
xz --info-memory
:
Total amount of physical memory (RAM): 595 MiB (623116288 B)
Memory usage limit for compression: Disabled
Memory usage limit for decompression: Disabled
Run Code Online (Sandbox Code Playgroud)
ulimit -a
:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority …
Run Code Online (Sandbox Code Playgroud)