我有一组文件夹,其中都有 zip 文件,每个文件夹中可能包含 1 或 2 个文件,每个文件位于一个新文件夹中。 (见下图)
我想将脚本指向顶级目录,并让它遍历每个子目录,提取 zip 的内容,将该子目录的内容向上移动一级(删除原始压缩文件(可选))。
--before--
Photos
-2018
--jan.zip
[--jan1 ]--\
[---jan1.pdf]---}-contents of Zipped file
[---jan1.JPG]--/
--feb.zip
[--feb1 ]--\
[---feb1.pdf]---}-contents of Zipped file
[---feb1.JPG]--/
...
--after--
Photos
-2018
--jan1.pdf
--jan1.JPG
--feb1.pdf
--feb1.JPG
答案1
在执行以下任何操作之前,请对顶级目录进行(递归)复制 - 为了安全起见。
您可以像这样实现您想要的目标:
将顶级目录(照片)设为当前工作目录。然后解压所有 zip 文件:
find . -iname "*.zip" -execdir unzip {} \;
现在将提取的目录的内容向上移动一级:
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;
这不会影响 zip 文件或提取的目录本身,这些目录在此步骤中会变为空。所以你现在可以删除它们:
find . -mindepth 2 -maxdepth 2 -type d -delete
在删除 zip 文件之前,请仔细检查一切是否正常。然后你可以用以下命令进行删除
find . -iname "*.zip" -delete
原则上,您可以将这些命令组合到一个脚本中,但我建议先逐一测试它们,然后在每个步骤后检查结果。
将顶级目录作为唯一参数的脚本可能如下所示:
#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} \;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete
如果您将其命名为“extract”(并设置执行权限),则可以在其自己的目录中使用它,如下所示(假设~/photos
为顶级目录):
./extract ~/photos
但请注意:该脚本从未经过测试。它自己也不进行测试。这完全取决于您描述的目录和 zip 文件结构。因此,请进行复制和测试运行。