여러 번 타르 처리된 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
이 간단한 bash
for 루프는 필요한 작업을 수행해야 합니다.
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