从 Shell 中使用嵌套 .tar 解压 File.tar.gz

从 Shell 中使用嵌套 .tar 解压 File.tar.gz

我正在尝试从 shell 脚本中解压文件。 file.tar.gz 中有一个文件是未解压的 tar 文件。

我尝试了几种方法但没有运气。

https://stackoverflow.com/questions/18897060/how-to-extract-a-tar-file-inside-a-tar-file

使用单个 tar 调用提取多个 .tar.gz 文件

#have tried this
for file in "$MY_TAR"
do
NEWDIR=`echo $file | tr -d [a-zA-Z.]`
mkdir $NEWDIR
tar -xvf $file -C $NEWDIR
done 

# And this
for file in *.tar.gz; do tar -zxf $file; done

#snip -------
for file in "$MY_ZIP"
do
if [ "$file" == "$NESTED_TAR"] ; then
mkdir "$NESTEDTAR_DIR"
tar -xOf "$file" -C  "$NESTEDTAR_DIR" | tar -x
else
tar -xvf "$file"
fi
done

编辑:使用 shell 脚本解压后,内容应该被解压并保留,并且要解压到它自己的命名目录中的 Nested_Tar.tar 。

示例输入 My_Tar:

/Unique_DirNameAfterUnTar
File1
Documents/
Nested_Tar.tar (this is not untaring needs to untar into dir named Nested_Tar)
File2
File3
Another_Documents_Dir/
File4

答案1

下面的脚本会将顶级 tar.gz 文件 (My_Tar.tar.gz) 提取到 $NEWDIR 中,然后循环提取的内容并将任何发现的 tar 文件提取到基于这些 tar 文件名的目录中。如果嵌套 tar 文件是在其内容“上方”创建的(例如,Nested_Tar.tar 已将“Nested_Tar/”作为子目录),那么您可以跳过mkdir下面的部分以及-C "$d"内部 .tar 文件的选项tar

NEWDIR=output
tar -xz -C $NEWDIR -f ../My_Tar.tar.gz
(cd $NEWDIR;
for f in *.tar
do
  d=$(basename "$f" .tar)
  mkdir "$d" && tar -x -C "$d" -f "$f"
done
)

我使用了一个子 shell,只是为了将现有 shell 的 pwd 保存在 cwd 中;如果您希望最终位于 $NEWDIR 内,只需删除外括号即可。

相关内容