遍历并解压缩目录,然后解压缩子目录中的项目

Loop through and unzip directories and then unzip items in subdirectories

我有一个按以下方式设计的文件夹:

-parentDirectory
---folder1.zip
----item1
-----item1.zip
-----item2.zip
-----item3.zip
---folder2.zip
----item1
-----item1.zip
-----item2.zip
-----item3.zip
---folder3.zip
----item1
-----item1.zip
-----item2.zip
-----item3.zip

我想编写一个 bash 脚本来循环遍历 unzip 文件夹,然后进入这些文件夹的每个子目录并解压缩文件并以特定方式命名这些文件。

我试过以下方法

cd parentDirectory
find ./ -name \*.zip -exec unzip {} \;

count=1

for fname in *
do
    unzip
    mv $fname $attempt{count}.cpp
    count=$(($count + 1))
done

我认为前两行将进入 parentDirectory 文件夹并解压缩该文件夹中的所有 zip,然后 for 循环将处理解压缩和重命名。但是相反,它解压了它能解压的所有内容并将其放在 parentDirectory 中。我想保持相同的目录结构。

如有任何帮助,我们将不胜感激

摘录自 man unzip

[-d 目录] 将文件提取到的可选目录。默认情况下,所有文件和子目录都在当前目录中重新创建; -d 选项允许在任意目录中提取(始终假设一个人有权写入该目录)。

它完全按照您的指示进行操作,如果您在命令行中执行相同的操作会发生什么情况。只要告诉它在哪里提取,因为你希望它在那里提取。

有关从 fname 中拆分路径的示例,请参阅 Ubuntu bash script: how to split path by last slash?

综合起来,你在parentDirectory中执行的命令是

find ./ -name \*.zip -exec unzip {} \;

但是你想解压缩到它找到文件的目录。我打算只在 dirname {} 上使用反引号,但我无法让它正常工作,因为它要么在 find 之前在“{}”文字上执行,要么从不执行。

最简单的解决方法是编写我自己的解压缩脚本,它会在适当的位置完成。

> cat unzip_in_place
unzip  -d `dirname `

> find . -name "*.zip" -exec ./unzip_in_place {} \;

您可能可以使用 unzip 的别名来自动执行此操作,但如果您使用其他希望 unzip 能够按文档说明工作的工具,那是不明智的。