Zip
解壓壓縮文件時如何只獲取目標文件夾中完全解壓的文件?
我正在嘗試解壓縮一個包含一百多個文件的大 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
,即在同一文件系統上的某個位置(以允許 atomicmv
)並且保證不會被任何其他程序使用,並且- 在循環內添加一個額外的
mkdir
步驟,以重建提取的目錄結構