![解压至同名目录](https://linux22.com/image/955182/%E8%A7%A3%E5%8E%8B%E8%87%B3%E5%90%8C%E5%90%8D%E7%9B%AE%E5%BD%95.png)
我正在尝试解压 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