ここに別の解決策があります。アーカイブから個々のファイルを抽出してサイズを縮小することはできませんが、すべてのファイルを抽出してアーカイブのサイズを縮小することはできます:
#!/bin/sh
# $1, the first paramter, is the .tar.gz file to unarchive
(
size=$(wc -c $1)
offset=0
bs=4096
while [[ $size > $offset ]]; do
dd if=$1 bs=$bs count=1 skip=$offset status=none
fallocate -p -o $offset -l $bs $1
offset=$(( $offset + $bs ))
done
) | tar xz
これを次のようなファイルに保存します。 untar_and_destroy.sh
次のように実行します:
untar_and_destroy.sh whatever.tar.gz
これが行うことは、.tar.gz
の一部を与えることです ファイルを tar に変換し、Linux にファイルのその部分の割り当てを解除するように要求し、次の部分について繰り返します。終わったら ls -l
.tar.gz
と言うでしょう ファイルのサイズは以前と同じですが、du
そのサイズは 0 として報告されます。これは .tar.gz
以前と同じ長さですが、ディスクに保存する必要のないすべての 0 を持つスパース ファイルに作成されました。
これを本番環境で使用しないでください。また、そのアーカイブを削除するのが悪い場所では使用しないでください。これにより、アーカイブが開始されるとすぐに読み取れなくなります。抽出中にハードディスクの空き容量が不足すると、これを実行する機会は二度とありません。
プライマリ ストレージを拡張するのは実際的ではないかもしれませんが、ファイルの内容を外部ストレージ デバイスに抽出することはできます。
または、アーカイブ内のファイルのリストを生成し、それらの一部を抽出するスクリプトを作成します。それらのファイルをクラウドに移動し、別のバッチを選択して抽出し、泡立て、すすぎ、繰り返します。
しかし、私が知っているすべてのアーカイブ アプリは、元のアーカイブ ファイルをそのままにしておく必要がありますが、不要なものを含まない新しいアーカイブ ファイルを作成する必要があるため、外部ストレージは非常に便利です。
これを行うことができるツールを知りませんし、一般的なアーカイブ形式がこれをサポートしているとは思いません.
問題の解決策の 1 つは、アーカイブを別のマシンに保存し、解凍先のマシンにパイプすることです。たとえば、アーカイブのあるマシンでこのコマンドを実行できます:
cat archive.tar.gz | ssh YOUR_SERVER tar xfz -
アーカイブは tar
にストリーミングされます サーバー上で実行されているプロセス。これにより、アーカイブがサーバー上に存在する必要なく解凍されます。