tar.gz自体内でtar.gzファイルを繰り返し解凍する方法

tar.gz自体内でtar.gzファイルを繰り返し解凍する方法

999回圧縮された同じ名前のファイルがあります**flag_999.tar.gz**。何も動作しないので、これらすべてのファイルや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スクリプトは、--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

これでわかります。すべてが正常に機能する場合、元のアーカイブには基本的に1つのファイルに一種の16進ハッシュが含まれています。

関連情報