循环浏览并解压缩目录,然后解压缩子目录中的项目

时间:2019-07-31 16:48:21

标签: bash shell directory unzip

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

-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中。我想保持与我相同的目录结构。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

摘录自人的压缩文件

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

它完全按照您的指示进行操作,如果您在命令行中执行了相同的操作,将会发生什么。只需告诉它要提取的位置即可,因为您希望将其提取到那里。

有关将路径从fname中分离出来的示例,请参见Ubuntu bash script: how to split path by last slash?

将它们放在一起,您在parentDirectory中执行的命令是

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

但是您想解压缩以解压缩到找到文件的目录。我本来只是在目录名{}上使用反引号,但我无法使其正常工作,因为它要么在查找​​前在“ {}”立即数上执行,要么从不执行。

最简单的解决方法是为解压缩编写我自己的脚本。

> cat unzip_in_place
unzip $1 -d `dirname $1`

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

您可能会别名化unzip来自动执行此操作,但是如果您曾经使用过其他希望unzip能够按记录工作的工具,那是不明智的。