我需要提取特定文件夹来自.tar.bz2
(34G)。问题是需要1个小时。我猜这是由于压缩造成的。我想对特定文件夹进行不压缩提取会更快。
因此,是否可以.tar
从获得.tar.bz2
?
答案1
如果您的问题是是否可以解压缩特定文件夹的相关部分,bzip2 不会索引其压缩数据,这意味着无法直接跳转到解压数据中的特定字节而不处理其之前的内容。tar
也是一种没有中心索引的顺序格式。
但是,如果您的问题是是否可以通过解压缩一次并多次提取单个文件夹来预先摊销工作,那么是的,可以使用以下命令bzip2
:
bzip2 -d foo.tar.bz2
然后这将解压缩为foo.tar
.
答案2
我想对特定文件夹进行不压缩提取会更快。
遗憾的是,由于压缩的性质和 tar 文件格式,这是不可能的。要知道文件在哪里,您需要解压缩整个压缩文件:文件之前的所有内容以了解其开始位置,以及文件之后的所有内容,因为tar
允许多次保留同一文件,以便您“稍后”同一文件的副本会覆盖较早的文件。只有当您解压缩最后一个文件时,您才能确定不再有该文件的副本。
因此,您唯一能做的就是使用并行 bzip2 实现更快地解压缩pbzip2
(您可能需要先安装它!)
pbzip2 -d -c large.tar.bz2 | tar xf - path/to/specific/folder
对于未来的归档:有些东西可以压缩或接近压缩bzip2
并允许很多更快的减压。因此,如果此问题更频繁地发生,那么使用允许更快解压缩的东西重新存档整个内容可能是有意义的,并且可以选择性提取而无需解压缩整个存档;就像是
pbzip2 -d -c large.tar.bz2 | sqfstar -comp zstd -xattrs -Xcompression-level=8 large.sqsh
(除了 之外pbzip
,您还需要sqfstar
,它在大多数系统(基于 fedora、基于 debian)上都是软件包的一部分squashfs-tools
)
奖励:这些档案可以直接安装,但您也可以使用命令行工具从中获取单个文件。
udisksctl loop-setup -f large.sqsh # note the displayed block device name
udisksctl mount -b /dev/loop1234 # only if not automounted by previous command
答案3
如果你想从file.tar.bz2中提取特定文件夹,然后将其放入自己的目标路径目录中:
tar -C /own/target_path/ -xvf file.tar.bz2 path/specific_folder_from_file_tar_bz2
解压到的具体文件夹在/own/target_path
问候...