圧縮ファイルを解凍するときにターゲットフォルダに完全に解凍されたファイルのみをインポートする方法は?

圧縮ファイルを解凍するときにターゲットフォルダに完全に解凍されたファイルのみをインポートする方法は?

それぞれ128MB、100個を超えるファイルを含む大容量zipファイルを解凍しようとしています。解凍が中断された場合は、解凍している最後のファイルを削除して再起動し、次のように既存のファイルをスキップするオプションを有効にする必要があります。

unzip -n my_compressed_file.zip -d destination

完全に解凍されたファイルだけがターゲットディレクトリに表示されるようにzipファイルを解凍する方法はありますか?

答え1

ファイルを一時的な場所に抽出し、ファイルが完了した後にのみ最終ターゲットに移動するラッパースクリプトを作成できます。それはまるで

tempdir="incomplete/"

mkdir -p "$tempdir"
zipinfo -1 compressed.zip | while read f ; do
        test -f "$f" && continue # skip anything extracted by a previous attempt
        printf "extracting %s..." "$f"
        unzip -p compressed.zip "$f" > "$tempdir/$f"
        printf "done!\n"
        mv "$tempdir/$f" "$f"
done
rm -r "$tempdir"

この操作が中断されても部分ファイルは残りますが、再実行するとファイル全体(正しい場所)をスキップし、部分ファイル(一時ディレクトリ)をすぐに上書きします。最終的にアーカイブの終わりに達すると、一時ディレクトリは完全に削除されます。

私のサンプルスクリプトにはいくつかの制限があります。 zipには独自のディレクトリ構造が含まれておらず、incomplete/作業フォルダ内の一時ディレクトリを使用しているとします。これが許可されていない場合は、次のことを行う必要があります。

  • tempdir同じファイルシステムのどこかにあり(原子性を許可するためにmv)、他のプロセスで使用されていない異なる値を使用します。
  • mkdir抽出されたディレクトリ構造を再構成するには、ループ内に追加の手順を追加します。

また、見ることができます私のfsにmv原子がありますか?

関連情報