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

时间:2014-06-05 10:08:32

标签: archive tar

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

存档包含多个子目录,而这些子目录又包含文件。当我提取一个子目录时,我需要所有其内容用它来提取。

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

3 个答案:

答案 0 :(得分:4)

您也可以使用

逐一提取
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包含子目录的名称

根据您的要求在上面添加休息条件。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

好的,基于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