我使用 Nautilus 的“压缩”功能将其压缩到一个 36MB 的文件夹。它创建了一个名为 的 tar 文件fs.tar.gz
。
其fs.tar.gz
大小为 98MB。
这怎么可能?
我确实在某处读到过符号链接或者类似的东西可能会导致这种情况 - 我的文件夹中确实有符号链接。
答案1
tar 文件有开销,因为它还包含有关如何重新创建文件的信息。如果您添加到 tar 文件本身的内容已经压缩,则最终得到的文件可能比所有文件的所有 Mib 加起来还要大。但是……我们说的是少量的开销。不像是所有文件大小的 2 倍。这确实有点像符号链接。
您可以使用tar -tvf fs.tar.gz | more
来查找已包含但“假定”不存在的文件。如果符号链接和文件都在您用于创建 tar 文件的目录中,则最终会包含这两个文件。
Tar 有一个不存档符号链接的选项;来自手册页:
-h, --dereference don't archive symlinks; archive the files they point to
处理符号链接时一定要小心:您最终可能会得到损坏的符号链接,需要自己进行修复。
Tar 允许使用 `--exclude {PATTERN} 或 --exclude_from {FILE} 排除文件。这样您就可以包含符号链接,然后包含文件,并跳过文件本身。
要仅包含文件而不包含符号链接,您可以使用
find /dir1 -type f |tar {etc}
答案2
我认为在某些情况下,tarring 可以产生更大的输出。我遇到了与 OP 相同的问题,但问题更大。我正在 tarring 的文件夹是 3.2K,输出 tar 文件是 4MB - 是原始大小的 1000 多倍。
自己重现一下——我在名为 Playground 的文件夹中创建了 100 个目录,然后在每个目录中创建了 26 个空文件:
$ mkdir -p playground/dir-{00{0..9},0{10..99},100}
$ touch playground/dir-{00{0..9},0{10..99},100}/file{A..Z}
$ tar cf playground.tar playground