解压至同名目录

解压至同名目录

我正在尝试解压 Google Takeout 提供的文件,需要一个命令将目录中的所有 zip 文件解压到与 zip 文件同名的目录中以避免冲突。zip 名称无法预先确定,因此解压后的目录也无法预先确定。

例如

-zipstore
----zipname1.zip
----zipname2.zip

应该导致

-zipstore
----zipname1.zip
----zipname1
----zipname2.zip
----zipname2

其中 zipname1 和 zipname2 是包含解压文件的目录。

进一步的考虑是,在解压之前如何检测 zip 是否已下载完成 - 这些是 10Gb 文件!!

答案1

据我所知,unzip 本身并不支持该功能,但它支持使用 指定提取目录名称-d

因此,为了提取单个档案,您可以定义自己的函数,利用 shell 的参数扩展来删除.zip文件名中的扩展部分,如下所示:

myunzip () 
{ 
    unzip "$1" -d "${1%.zip}"
}

...然后像这样使用它:

myunzip zipname1.zip

或者使用 shell 循环一次性提取当前工作目录下的所有存档文件,如下所示:

for a in *.zip; do unzip "$a" -d "${a%.zip}"; done

但是,要持续监视某个下载目录并自动解压已完成的 zip 存档文件下载,您需要使用例如对该目录设置监视inotifywait及其close_write事件(等待存档文件完全下载并写入磁盘)。您可以在脚本中实现如下功能:

#!/bin/bash

inotifywait -m -q -e close_write /path/to/dir/ |
  while read -r path action file; do
    if [[ "$file" =~ .*\.zip$ ]]; then
      unzip "$path$file" -d "${path}${file%.zip}"
      fi
  done

相关内容