我正在尝试解压缩一个大 zip 文件,其中包含一百多个文件,每个文件 128 MB。当解压中断时,我必须删除最后一个正在解压的文件,然后重新启动并启用跳过现有文件的选项,如下所示:
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
在循环内添加一个额外的步骤,以重建提取的目录结构
也可以看看mv 在我的 fs 上是原子的吗?