bash:仅提取 tar.gz 存档的一部分

Posted

技术标签:

【中文标题】bash:仅提取 tar.gz 存档的一部分【英文标题】:bash: extract only part of tar.gz archive 【发布时间】:2014-06-05 10:08:31 【问题描述】:

我有一个非常 .tar.gz 文件,由于空间不足,我无法将其全部提取出来。我想提取 一半的内容,处理它们,然后提取剩下的一半。

存档包含几个子目录,这些子目录又包含文件。当我提取一个子目录时,我需要 all 将其内容与它一起提取。

bash 中执行此操作的最佳方法是什么? tar 是否已经允许这样做?

【问题讨论】:

这应该在 unix.stachexchange.com 因为它不是关于编程的 【参考方案1】:

你也可以使用一一提取

tar zxvf file.tar.gz PATH/to/file/inside_archive -C DESTINATION/dir

您可以包含一个脚本:

1) 保持 PATH 和 DESTINATION 相同(是的,您可以使用自己的基本目录作为 DESTINATION)

2) 您可以使用

获取存档中文件的路径
tar -ztvf file.tar.gz

3) 您可以使用 for files in $(tar -ztvf file.tar.gz | awk 'print $NF') 之类的 for 循环,并根据需要定义中断条件。

我会这样做:

#!/bin/bash
for files in $(tar -ztvf file.tar.gz| awk 'print $NF')
do 
subDir=$(dirname $files)
echo $subDir     
tar -C ./My_localDir/$subDir -zxvf file.tar.gz $files 
done

$subDir 包含子目录的名称

根据您的要求在上面添加中断条件。

【讨论】:

谢谢。我可以只列出存档中的所有子目录(它们都在层次结构的第一级)并提取其中的前 n 个吗?会不会容易些? 检查刚刚在答案中添加的部分是否有帮助。 谢谢。不过,我不明白你从哪里得到“目录名”。我的想法是遍历它的子目录(它们都是这个档案文件层次结构的第一级),并通过保留一个非常简单的计数器来提取它们中的前 n 个。总的来说,我很困惑。在图形环境中这需要 3 秒...:/ 我只是找不到以 非递归 方式在存档中列出所有内容的方法。这样我只会得到这些子目录的名称,我希望可以直接提取它们...... @RickyRobinson 检查现在是否适合您。我正在打电话,请原谅我的麻烦。【参考方案2】:

例如,您可以仅提取与某些模式匹配的文件:

tar -xvzf largefile.tar.gz --wildcards --no-anchored '*.html'

因此,根据 largefile.tar 结构,可以使用一种模式提取文件 -> 处理它们 -> 之后删除文件 -> 使用另一种模式提取文件,依此类推。

【讨论】:

当然,但我确实需要将子目录全部提取出来并保持存档的原始结构。很抱歉之前没有提及。【参考方案3】:

好的,所以基于this answer,我可以列出所需深度的所有内容。 就我而言,tar.gz 文件的结构如下:

archive.tar.gz:
archive/
archive/a/
archive/a/file1
archive/a/file2
archive/a/file3
archive/b/
archive/b/file4
archive/b/file5
archive/c/
archive/c/file6

所以我想遍历子目录a, b, c,例如提取其中的前两个:

parent_folder='archive/'
max_num=2
counter=0
mkdir $parent_folder
for subdir in `tar --exclude="*/*/*" -tf archive.tar.gz`; do
    if [ "$subdir" = "$parent_folder" ];
    then
        echo 'not this one'
        continue        
    fi
    if [ "$counter" -lt "$max_num" ];
    then
        tar zxvf archive.tar.gz $subdir -C ./$parentfolder$subdir
        counter=$((counter + 1))
    fi
done

接下来,对于剩余的文件:

max_num=2
counter=0
mkdir $parent_folder
for subdir in `tar --exclude="*/*/*" -tf files.tar.gz`; do
    if [ "$subdir" = "$parent_folder" ];
    then
        echo 'not this one'
        continue        
    fi
    if [ "$counter" -ge "$max_num" ];
    then
        tar zxvf files.tar.gz $subdir -C ./$parent_folder$subdir
    fi
    counter=$((counter + 1))
done

【讨论】:

以上是关于bash:仅提取 tar.gz 存档的一部分的主要内容,如果未能解决你的问题,请参考以下文章

从存档中提取精确文件的快速方法

如何使用 bash 从 tar.gz 存档中列出目录大小

如何提取 filename.tar.gz 文件

如何在不包含父目录的 Python/tar 中创建 tar.gz 存档?

如何在不解压缩内容的情况下查看 .tar.gz 存档中特定文件的内容?

tar:存档中出现意外的 EOF