如何重复解压 tar.gz 本身内的 tar.gz 文件

如何重复解压 tar.gz 本身内的 tar.gz 文件

有一个文件的名称**flag_999.tar.gz**已被打包了 999 次,有什么方法可以解压所有这些文件或 bash 脚本,因为没有任何东西对我有用。

该文件的名称为 flag_999.tar.gz,在存档内有 flag_998.tar.gz,其中有 flag_997.tar.gz。所以这里的“flag_”是恒定的,然后数字递减我手动到达flag_967.tar.gz来检查里面的文件名。

我试过:

file=(*tar); while [[ -e $file ]]; do tar zxf "$file"; rm "$file"; file=(*tar); done

无输出

awk -F'\0' '/[^\0]/{print $(NF)}' flag_999.tar.gz

输出不可读

for i in {1000..1}; do tar -xf $i.tar; done

也许这可行,我不知道,因为我不知道如何使用它。

单击此处查看并下载文件https://drive.google.com/file/d/1ycWVR0htwFyexCJRohTGHio4UFdvGuPW/view?usp=sharing

答案1

通过 GNU 实现tar,您可以编写extract如下脚本:

#! /bin/sh -
PROGNAME="$0" exec tar -zxvvf - --to-command='
  case "$TAR_FILENAME" in
    (*.tar.gz | *.tgz) exec "$PROGNAME";;
    (*) set -o noclobber
        mkdir -p -- "$(dirname -- "$TAR_FILENAME")" &&
          exec cat > "$TAR_FILENAME"
  esac' 3<&-

被调用为:

path/to/extract < flag_999.tar.gz

在你的情况下。

tar该脚本将通过's--to-command对于名称以.tar.gz或结尾的每个存档成员递归地调用自身.tgz。它将即时提取文件,而不将中间 tar 文件存储在磁盘上。

请注意,它仅提取常规文件,不会恢复任何文件元数据。

答案2

这个奇怪的文件是一个很好的压力测试拉塔芒特。它基本上可以使用该选项开箱即用,--recursive但存在文件路径变得太长到类似mountpoint/flag_998.tar.gz/flag_997.tar.gz/flag_996.tar.gz/flag_995.tar.gz/flag_994.tar.gz/....为了避免这种情况,我在现有命令行选项中添加了一个更通用的命令行选项--strip-recursive-tar-extension,以便您现在可以使用 任意转换递归 tar 的挂载点--transform-recursive-mount-point。目前尚未完全发布,但您已经可以像这样尝试:

python3 -m pip install --user --force-reinstall 'git+https://github.com/mxmlnkn/ratarmount.git@develop#egginfo=ratarmountcore&subdirectory=core'
python3 -m pip install --user 'git+https://github.com/mxmlnkn/ratarmount.git@develop#egginfo=ratarmount'

ratarmount --recursive --transform-recursive-mount-point '.*/' '' flag_999.tar.gz mountpoint
ls -lA mountpoint
# drw-r--r-- 1 root root    146 May 24  2019 flag_0.tar.gz
# drw-r--r-- 1 root root  17331 May 24  2019 flag_100.tar.gz
# drw-r--r-- 1 root root  17490 May 24  2019 flag_101.tar.gz
# drw-r--r-- 1 root root  17652 May 24  2019 flag_102.tar.gz
ls -lA mountpoint/flag_0.tar.gz/
# -rw-r--r-- 1 root root 33 May 24  2019 flag.txt
cat mountpoint/flag_0.tar.gz/flag.txt

现在你就得到了它。如果一切正常,您的原始存档基本上只在单个文件中包含某种十六进制哈希值。

相关内容