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

이제 알 수 있습니다. 모든 것이 제대로 작동한다면 원본 아카이브에는 기본적으로 단일 파일에 일종의 16진수 해시가 포함되어 있는 것입니다.

관련 정보