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が1つだけ必要です。
  • 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 

関連情報