![压缩(通过 tar gzip)后的大小远大于原始文件夹](https://linux22.com/image/994496/%E5%8E%8B%E7%BC%A9%EF%BC%88%E9%80%9A%E8%BF%87%20tar%20gzip%EF%BC%89%E5%90%8E%E7%9A%84%E5%A4%A7%E5%B0%8F%E8%BF%9C%E5%A4%A7%E4%BA%8E%E5%8E%9F%E5%A7%8B%E6%96%87%E4%BB%B6%E5%A4%B9.png)
/var/www
我使用以下tar
命令(包括-z
(gzip))备份了文件夹:
tar -cvzf file.gz /var/www/*
我检查了 的大小www
。它大约是 100kb,但 生成的文件大小tar
大约是 185Mb。这是什么原因造成的?
答案1
ls -sh
不考虑子目录。
我将用du -csh -- *
它来计算这个(这--
可以防止以“破折号”开头的文件出现问题)。其中...
-s, --summarize
display only a total for each argument
-h, --human-readable
print sizes in human readable format (e.g., 1K 234M 2G)
-c, --total
produce a grand total
但是如果你有硬链接的话它会扰乱总数。
答案2
你可能搞错了原始目录的内容有多大。对于目录,ls -l
列出目录本身的大小,不是该目录中包含的文件。例如
drwxr-xr-x 8 www-data www-data 4096 Sep 2 03:12 some-dir
显示目录本身占用 4096 字节。但这只是some-dir
文件系统结构中条目的大小。要汇总目录内容的大小,可以使用du
(“磁盘使用情况”),例如
du -s some-dir
与ls
其他一些命令一样,您可以使用h
“人类可读”单位的开关:
du -s some-dir
1804 some-dir
du -sh some-dir
1,8M some-dir
答案3
这次情况并非如此(见接受的答案),但有时归档和压缩的额外开销可能会导致归档比原始内容更大。
当熵极高时,情况确实如此,例如目录中充满了随机文本和/或媒体文件。
示例 1:随机数据
$ dd if=/dev/urandom of=test bs=1M count=100 $ tar -zcf 测试.tgz 测试 $ tar -cf 测试.tar 测试 $ gzip -ck --best test.tar > test-best.tar.gz $ gzip -ck --fast test.tar > test-fast.tar.gz $ xz -ck --fast test.tar >test.tar.xz $ xz --fast -ck 测试>test.xz $ gzip --best -ck 测试>test.gz $ bzip2 --best -ck 测试>test.bz2 $ ls -lS 测试* -rw-r--r-- 1 adamhotep adamhotep 105326395 10月 7 16:52 test.bz2 -rw-r--r-- 1 adamhotep adamhotep 104875661 10月 7 16:49 test-fast.tar.gz -rw-r--r-- 1 adamhotep adamhotep 104875661 10月 7 16:48 test.tar.gz -rw-r--r-- 1 adamhotep adamhotep 104874474 10月 7 16:49 test-best.tar.gz -rw-r--r-- 1 adamhotep adamhotep 104874206 10月 7 16:51 test.gz -rw-r--r-- 1 adamhotep adamhotep 104867840 10月 7日 16:48 test.tar -rw-r--r-- 1 adamhotep adamhotep 104864052 10月 7 16:50 test.tar.xz -rw-r--r-- 1 adamhotep adamhotep 104862868 10月 7 16:50 test.xz -rw-r--r-- 1 adamhotep adamhotep 104857600 10月 7日 16:47 测试
这创建了一个随机的 100M 文件,然后以几种不同的方式对其进行存档和压缩。结果按大小排序(最大优先)。如您所见,tarball 容器和压缩标头的开销很大,而且明显缺乏可压缩的模式。
毫无疑问,原始随机文件在这里是最小的。
(我使用-ck
并通过管道传输了压缩命令的输出,以便您可以更清楚地看到它创建了什么输出文件。这是多余的。)
示例 2:视频+音频数据
$ youtube-dl -o test.mp4'https://www.youtube.com/watch?v=dQw4w9WgXcQ' [youtube] dQw4w9WgXcQ:正在下载网页 [youtube] dQw4w9WgXcQ:下载视频信息网页 [youtube] dQw4w9WgXcQ:提取视频信息 [youtube] dQw4w9WgXcQ:正在下载 js 播放器 en_US-vflOj6Vz8 [下载] 目标:test.mp4 [下载] 100% 56.64MiB,耗时 00:07 $ gzip --best -ck test.mp4 >test.mp4.gz $ xz --fast -ck test.mp4 >test.mp4.xz $ ls -lS 测试.mp4* -rw-r--r-- 1 adamhotep adamhotep 59388616 10月 7 16:52 test.mp4 -rw-r--r-- 1 adamhotep adamhotep 59332683 10月 7 16:52 test.mp4.gz -rw-r--r-- 1 adamhotep adamhotep 59320572 10月 7 16:52 test.mp4.xz
我重复了此测试视频的 gzip 和 xz 测试。元数据足够多,仅需通过压缩即可缩小它(西泽可以节省 68k,高达 0.1%!)。我怀疑这与 .mp4 留下的提示有关,以确保正确的流式传输和视听同步。这个特定的视频缺少字幕。
简而言之,不要压缩随机或压缩数据。