我有一个大 .tar.gz
文件,由于空间不足,我无法将其全部提取出来。我想提取 一半的内容,处理它们,然后提取剩下的一半。
存档包含多个子目录,而这些子目录又包含文件。当我提取一个子目录时,我需要所有其内容用它来提取。
在 bash 中执行此操作的最佳方法是什么? tar
是否允许此操作?
答案 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