您如何递归目录、解压缩和向上移动所有内容?

veg*_*ega 3 command-line find unzip

假设我有以下目录树

.
??? a1
?   ??? sub1
?       ??? a1.zip
??? a2
    ??? sub2
        ??? a2.zip
Run Code Online (Sandbox Code Playgroud)

当前目录包含a1a2目录。我想递归搜索,定位并提取所有zip文件,以及一切举动最多a1a2分别。目标状态是:

.
??? a1
?   ??? file1
?   ??? file2
??? a2
    ??? file1
    ??? file2
Run Code Online (Sandbox Code Playgroud)

文件来自 zip 的位置。我如何做到这一点?为此,我应该在终端中使用哪些工具?

编辑

更具体地说,我提到了递归,因为我们不知道有多少子目录。它可能是:

.
??? a1
?   ??? sub1
?       ??? sub...
?                ??? a1.zip
?                ??? text1.txt
??? a2
    ??? sub2
        ??? sub...
                 ??? a2.zip
                 ??? text2.txt
Run Code Online (Sandbox Code Playgroud)

目标:

.
??? a1
?   ??? file1_unzipped
?   ??? text1.txt
??? a2
    ??? file1_unzipped
    ??? text2.txt
Run Code Online (Sandbox Code Playgroud)

des*_*ert 6

1.解压所有.zip档案

find . -type f -name "*.zip" -exec unzip {} +
Run Code Online (Sandbox Code Playgroud)

说明

  • find . – 搜索当前目录
  • -type f – 文件
  • -name "*.zip"– 名字匹配*.zip(所以以 结尾.zip),
  • -exec unzip {} +-让所有的比赛和一个长长的名单,并运行unzip

2.将所有文件从较低级别移动到当前级别下的一级

for i in */; do find "$i" -type f -exec mv {} "$i" \; && rm -r "$i"*/; done
Run Code Online (Sandbox Code Playgroud)

说明

  • for i in */; do …; done – 遍历当前级别的所有目录
  • find "$i" -type f – 搜索当前处理目录及以下目录中的所有文件
  • -exec mv {} "$i" \; – 将它们移动到当前处理的目录
  • && 仅当上一个命令成功完成时才执行以下操作
  • rm -r "$i"*/ – 删除当前处理目录中的每个子目录