何度もタールされた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が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