すでに解凍されたファイルを .tar から削除することは可能ですか?

すでに解凍されたファイルを .tar から削除することは可能ですか?

.tarディスク容量の約 70% を占めるファイルがあり、同じディスクに解凍する必要があります。tarコマンドには、プロセス中にすでに解凍されたファイルを削除して、それ以上容量を占有しないようにするオプションがありますか? オプションでは、アーカイブ--deleteから特定のファイルを削除できるようです.tarが、最後に解凍されたファイルを常に削除するように指示する方法はありますかtar? この方法だと、解凍されたファイルのサイズが大きくなるにつれて、サイズは.tar最終的に 0 まで減少します。

さらに、プロセスが中断された場合でも、解凍されたファイルのみが .ini 内に残っているため、中断したところからプロセスを続行できます.tar

答え1

#! /bin/bash
test ! -e "$1" && echo "Run with a tar archive" && exit
tar --list -f "$1" | tac | while IFS= read -r fname; do
    test "${fname: -1}" = '/' && continue # skip directories
    tar --extract -f "$1" "$fname" || exit 1 # let's stop in case we can't extract a file
    tar --delete  -f "$1" "$fname" || exit 2 # just in case
done
test "$?" = "0" && tar xf "$1" # restore directories timestamps

tacファイルの順序を逆にするために使用されます。これにより、tar はファイルを削除した後にアーカイブ全体を書き直す必要がなくなり、アーカイブを切り捨てるだけで済みます。このスクリプトをいくつかのファイルでテストしましたが、問題なく動作しますが、小さなファイルが多数含まれるアーカイブでは非常に遅くなる可能性があります。

"${fname: -1}"ファイル名の最後の記号を抽出します。スラッシュの場合はディレクトリなので、スキップします。移植可能なバージョンについてはコメントを確認してください。

関連情報