Bash 脚本用于在文件夹之间移动、解压缩以及将文件向上移动到一个目录

Bash 脚本用于在文件夹之间移动、解压缩以及将文件向上移动到一个目录

我有一组文件夹,其中都有 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 文件结构。因此,请进行复制和测试运行。

相关内容