Zip

解壓壓縮文件時如何只獲取目標文件夾中完全解壓的文件?

  • November 6, 2018

我正在嘗試解壓縮一個包含一百多個文件的大 zip 文件,每個文件 128 MB。當解壓中斷時,我必須刪除最後一個正在解壓的文件,然後重新啟動並啟用跳過現有文件的選項,如下所示:

unzip -n my_compressed_file.zip -d destination

有沒有辦法解壓縮 zip 文件,以便只有那些完全解壓縮的文件出現在目標目錄中?

您可以編寫一個包裝腳本,將文件提取到一個臨時位置,並僅在完成後將它們移動到最終目的地。就像是

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,即在同一文件系統上的某個位置(以允許 atomic mv)並且保證不會被任何其他程序使用,並且
  • 在循環內添加一個額外的mkdir步驟,以重建提取的目錄結構

另請參閱mv 在我的 fs 上是原子的嗎?

引用自:https://unix.stackexchange.com/questions/480098