解压压缩文件时如何仅获取目标文件夹中完全解压的文件?

解压压缩文件时如何仅获取目标文件夹中完全解压的文件?

我正在尝试解压缩一个大 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 上是原子的吗?

相关内容