Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在不扫描整个tar.gz的情况下提取少量文件_Bash_Shell_Tar - Fatal编程技术网

Bash 在不扫描整个tar.gz的情况下提取少量文件

Bash 在不扫描整个tar.gz的情况下提取少量文件,bash,shell,tar,Bash,Shell,Tar,我想从tar.gz中的一个目录中提取几个文件。问题是,在这个位置我发现了很多文件,而解包整个文件夹的过程效率很低。我试图单独提取它们,但在提取特定文件之前,它会扫描整个包。有没有办法跳过扫描并直接提取 用于逐个提取单个文件的脚本: filesList=( "file1" "file2" "file3" ) filesPath="path/to/files/inside/targz/" for i in "${filesList[@]}" do tar -xvf compressed.t

我想从tar.gz中的一个目录中提取几个文件。问题是,在这个位置我发现了很多文件,而解包整个文件夹的过程效率很低。我试图单独提取它们,但在提取特定文件之前,它会扫描整个包。有没有办法跳过扫描并直接提取

用于逐个提取单个文件的脚本:

filesList=( "file1" "file2" "file3"  )
filesPath="path/to/files/inside/targz/"
for i in "${filesList[@]}"
do
    tar -xvf compressed.tar.gz $filesPath$i
done

要从tar中提取特定文件,可以使用:

tar -zxvf <tar_name> <file_to_untar>
tar-zxvf

不确定是否取消扫描(可能在脚本的另一部分)。可以避免for循环,只调用一次tar

tar -xvf compressed.tar.gz "${filesList[@]/#/$filesPath}"
或者先处理列表

filesList=( "file1" "file2" "file3"  )
filesPath="path/to/files/inside/targz/"
filesPathList=()
for i in "${filesList[@]}"
do
    filesPathList+=("$filesPath$i")
done
tar -xvf compressed.tar.gz "${filesPathList[@]}"

我刚刚看到它是一个tar.gz,在循环中膨胀得很厉害(
gzip-cd
zcat
)。这就解释了性能差的原因,另一个选项可以是先gunzip。

要提取tar.gz(而不是tar),请添加选项
-z
。所谓扫描,我的意思是解压单个文件夹的过程与解压整个包的过程相同。不同的是,在整体的情况下,它会打印所有路径(而不是所选路径)。这真是个好主意。我不知道我可以这样用“焦油”。无论如何,它仍然会“寻找”路径。可能我完全误解了提取过程:要提取tar.gz(不是tar)add选项
-z
@Cyrus实际上它取决于tar的版本,它可以在没有
z
的情况下工作,我刚刚测试了它,它可以工作(gnu tar 1.29)。我也会在没有
-
的情况下写作,因为
xvf
tf
是参数而不是选项,但我让它像问题一样。@NahuelFouilleul:有趣。谢谢你提供的信息。更确切地说,它们是选项,我更熟悉它的旧语法。到底是什么改变了“通过gzip过滤存档”选项,我的意思是-z?@Jyoti:要提取tar(而不是tar.gz),请删除
-z