我有一个又大又重的文件夹树,其中包含许多文件和文件夹。我想压缩它以减少存储大小。这棵树将不再经常使用,但很可能我将来需要导航它并从中提取一两个特定文件。
因此,我不想拥有一个包含完整树的巨大压缩 tar 文件,因为这将使以后导航变得非常困难,并且我将不得不解压缩所有内容以提取任何文件......对吗?它还需要两倍的空间,直到我准备好 tar 文件,然后我可以删除原始树。
所以我想使用 bz2 或 xz 之类的东西并单独压缩每个文件。但是,如果子文件夹中有许多小且相似的文件,我想压缩每个文件的效果不如将所有文件聚合到一个 tar 文件中然后压缩它......对吗? (我假设如果有更多信息要压缩,压缩器可以找到更多冗余)。
那么,我该怎么办呢?
聚合文件以获得最佳压缩的想法与将它们分开保存以便以后轻松导航和提取信息的想法相反。是否有工具或推荐的方法来选择中间点?例如,我是否应该搜索所有结束文件夹(位于树的每个分支末尾的文件夹)并首先对其内容进行 tar,然后压缩它们,然后继续到上述深度并迭代?
编辑:测试用例
我对使用 的单个文件的压缩xz
和使用 的所有文件的压缩进行了比较7z
。测试用例由 58000.66 M 的文件夹树组成,其中 1250397 个文件分类为 4290 个目录。压缩所有内容后:
find . -type f -print0 | xargs -0 xz
我得到 14576.68 M。但是,如果我压缩整个树,7z
我得到 9622.74 M,几乎减少了 5 GB。
答案1
...必须解压缩所有内容才能提取任何文件...对吗?
如果你避免焦油就不会;搜索文件名并从存档中提取单个文件很容易(对于 .zip、.7z 来说速度很快)。例子;
> du -h a.*
223M a
115M a.tar.gz
75M a.7z
> 7z l a.7z | wc -l
2253
> ( time 7z l a.7z >/dev/null ) 2>&1 | grep user
user 0m0.014s
> ( time tar -ztf a.tar.gz >/dev/null ) 2>&1 | grep user
user 0m2.055s
...压缩每个文件的效果不如将所有文件聚合到一个 tar 文件中然后压缩它...对吗?
正确的。
我的第一条评论是,7z 是多线程和索引的,而 tar.xz 不是,因此存在巨大的性能差异。
但实际上我只会使用文件系统或设备映射器进行压缩;
vdo create --name=vdo_volume --device=/dev/vda
压缩的文件系统; https://en.m.wikipedia.org/wiki/Category:压缩文件系统 例如
mount -t btrfs -o compress=lzo /dev/sdb /media/my_compressed_files
请注意,这两个操作都可以在环回设备上完成,因此它们可以像文件中的整个文件系统一样运行。
还有一些归档熔丝驱动程序,例如fuse-7z-ng,它们的数据检索速度很快,但写入性能却很糟糕。
fuse-7z-ng files.7z /media/my_compressed_files
答案2
使用tar
的-tvf
选项,您可以列出使用 tar 创建的任何存档的内容,甚至可以与 gzip、bzip2 或 xz 等其他库结合使用。
tar -tf file.tar
tar -ztf file.tar.gz
tar -jtf file.tar.bz2
tar -Jtf file.tar.xz
列出内容可以让您专门识别要从存档中提取的文件,然后您可以使用特定路径来提取文件。
假设您的路径是home/user/old/photos/beach2012/bigbeachball.jpg
.
tar -xf file.tar home/user/old/photos/beach2012/bigbeachball.jpg
tar -zxf file.tar.gz home/user/old/photos/beach2012/bigbeachball.jpg
tar -jxf file.tar.bz2 home/user/old/photos/beach2012/bigbeachball.jpg
tar -Jxf file.tar.xz home/user/old/photos/beach2012/bigbeachball.jpg
如果您的存档文件不会发生太大变化(即,您不会经常向其中添加或删除文件),则您始终可以将内容提取到文本文件中。将内容放在可以使用 grep 搜索的文本文件中可以使查找文件比每次要搜索时都必须处理存档更容易。
答案3
我一直对此非常感兴趣,以下是我研究过的几个选项:
南瓜文件系统
壁球允许您归档和压缩数据,但稍后将其安装为文件系统,以便您可以像未压缩一样浏览它:
mksquashfs some/directory dir.squashfs
mkdir mnt
sudo mount -t squashfs dir.squashfs mnt
这只能以 root 身份运行,并且只能在 Linux 上运行。但挤压保险丝允许您在任何支持 FUSE 的系统上以非 root 身份执行此操作。
像素
有人已经提到过像素——但它不仅仅是并行化的 xz。它还添加了一个文件索引到压缩档案,这使得小型操作更加高效。例如:
# Listing files, and extracting a single file, using normal tar + xz
# So slow, not practical for interactive use.
$ time tar -tf 8gigs.tpxz > /dev/null
371.99s user 5.45s system 99% cpu 6:21.00 total
$ time tar -xf 8gigs.tpxz dir/somefile.txt
375.04s user 5.45s system 99% cpu 6:21.00 total
# Using pixz instead it's much faster!
$ time pixz -l < 8gigs.tpxz > /dev/null
0.01s user 0.01s system 38% cpu 0.035 total
$ time pixz -x dir/somefile.txt < 8gigs.tpxz | tar x
0.33s user 0.02s system 97% cpu 0.359 total
免责声明
我写了pixz 和squashfuse——因为我遇到了像你这样的问题。