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 存档的一部分的主要内容,如果未能解决你的问题,请参考以下文章
如何在不包含父目录的 Python/tar 中创建 tar.gz 存档?