【问题标题】:Loop through and unzip directories and then unzip items in subdirectories循环并解压缩目录,然后解压缩子目录中的项目
【发布时间】:2019-12-09 06:12:12
【问题描述】:

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

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

任何帮助将不胜感激

【问题讨论】:

    标签: bash shell directory unzip


    【解决方案1】:

    摘自 man unzip

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

    它完全按照你告诉它的做,如果你在命令行上做同样的事情会发生什么。只需告诉它在哪里提取,因为您希望它在那里提取。

    请参阅Ubuntu bash script: how to split path by last slash? 以获取从 fname 中拆分路径的示例。

    把它们放在一起,你在 parentDirectory 中执行的命令是

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

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

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

    > cat unzip_in_place
    unzip $1 -d `dirname $1`
    
    > find . -name "*.zip" -exec ./unzip_in_place {} \;
    

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

    【讨论】:

    • 啊,好吧,我明白你在说什么。也许我理解不正确,但我相信所有的 zip 文件都在我所谓的 exdir 中。我希望能够维护我已有的文件结构。
    • 我只是说使用 -d `dirname {}` 来提取相对于它们所在位置的它们。如果您不告诉他们在哪里提取,他们应该在父(当前)目录中提取。我添加了语法,用 -exec echo 测试。
    • 我不明白您为什么要进行第二次解压缩而不使用任何参数。我不认为那正在做你认为它正在做的事情。一切都被 find 解压了,因为你告诉它 -exec unzip {}
    • 我对 find 命令的工作方式感到困惑。此外,事实证明我不必重命名文件。所以我只需要解压缩所有内容并维护目录的层次结构。上面列出的第二个命令没有做到这一点。所有解压后的文件都在父目录中
    • 我使用 exec echo 进行的基本测试有点仓促。我已经重现并修复了这个问题,并在正确的位置解压缩了一个实际的 zip 文件。
    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多