tar 자체 내에서 tar 파일의 압축을 반복적으로 푸는 방법

tar 자체 내에서 tar 파일의 압축을 반복적으로 푸는 방법

여러 번 타르 처리된 tar 파일이 있습니다. 비슷한 구조를 따릅니다.

1000.tar
  |
   --- filler.txt (random text)
       999.tar
         |
          --- filler.txt
              998.tar

                ...

tar 구조의 최종 .txt를 얻으려면 명령/코드를 어떻게 작성해야 합니까? 이 작업을 수동으로 수행할 수도 있지만 tar -xf 1000.tar코드를 사용하는 것이 더 효율적입니다.

내 생각에 코드는 다음과 같아야 한다.

for i in range 1000, 1:
   tar -xf string(i) + ".tar"

답변1

이 간단한 bashfor 루프는 필요한 작업을 수행해야 합니다.

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

답변2

이것은 tarball의 파일 이름을 미리 알 필요가 없는 재귀적 방법입니다. 다른 내용이 포함되지 않은 디렉터리에 파일을 저장합니다. 그런 다음 상위 아카이브에 포함된 모든 타르볼에 .tar확장자가 있다고 가정하면 다음과 같이 간단히 수행할 수 있습니다.

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

설명하다

  • file=(*tar);$file: 파일 이름을 포함하도록 변수를 설정합니다 . *tar프로그램이 실행되는 디렉터리에는 파일과 일치하는 glob이 하나만 있어야 합니다.
  • while [[ -e $file ]]; do: $file있을 때...
  • tar xf $file; rm "$file"; file=(*tar);: 압축을 푼 tarball의 현재 값 $file, 방금 압축을 푼 tarball을 삭제하고 마지막으로 변수를 $file현재 디렉토리에 있는 유일한 새 tar 파일의 이름으로 설정합니다.

다음은 보다 직접적인 접근 방식입니다(@kusalananda 감사합니다!). tar다음 명령을 사용하여 아카이브를 만들었습니다 .

$ cat file 
This is the text!
$ file=file; for i in {1..1000}; do tar cf $i.tar $file; file=$i.tar; done

file이것은 텍스트를 포함하는 이라는 파일입니다 This is the text!\n. 1000번이나 타르 처리되었으며 file이제 를 갖게 되었습니다 1000.tar. 다음을 사용하여 원본 텍스트를 인쇄할 수 있습니다.

$ awk -F'\0' '/[^\0]/{print $(NF)}' 1000.tar 
This is the text!

실제 원문은 아니라는 점 참고해주세요. 원래 개행 문자는 삭제되었지만 tar교체되었습니다 awk. 필요한 아카이브에서 실제 가치를 얻으려면 ( $줄 바꿈 없이 끝에 내 팁이 있습니다):

$ awk -F'\0' '/[^\0]/{printf "%s", $NF}' 1000.tar 
This is the text!$

awk이 특별한 경우에는 마지막 필드( $NF)와 마지막 필드 앞의 438번째 필드를 인쇄하도록 지정하여 파일 이름을 다시 만들 수도 있습니다 .

awk -F'\0' '/[^\0]/{print $(NF) >$(NF-438)}' 1000.tar 

file이렇게 하면 원본 콘텐츠로 새 콘텐츠가 생성됩니다. 그래서 추출과 동일합니다. 그러나 이것이 -428마법의 숫자인지 는 모르겠습니다 . tar아카이브에 여러 개의 NULL이 추가된 것 같아서 다음을 실행하여 알아냈습니다.

$ awk -F'\0' '{for(i=1;i<=NF;i++){ if($i ~ /file/){print i,NF-i}}}' 1000.tar 
434674 438

이는 필드 434674에 file마지막 필드 앞의 438개 필드인 content 가 있음을 알려줍니다.

awk이를 지원하는 경우 gsub다음을 통해 보다 일반적으로 만들 수 있습니다.

awk -F'\0' '/[^\0]/{gsub(/\0+/,"\0"); print $NF > $(NF-11)}' 1000.tar 

관련 정보