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

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

假设我有以下目录树

.
├── a1
│   └── sub1
│       └── a1.zip
└── a2
    └── sub2
        └── a2.zip

当前目录包含a1a2目录。我想递归搜索、定位和提取所有 zip 文件,并将所有内容分别移动到a1a2。目标状态是:

.
├── a1
│   ├── file1
│   └── file2
└── a2
    ├── file1
    └── file2

文件来自 zip 文件。我该如何实现?我应该在终端中使用哪些工具来实现?

编辑

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

.
├── a1
│   └── sub1
│       └── sub...
│                └── a1.zip
│                └── text1.txt
└── a2
    └── sub2
        └── sub...
                 └── a2.zip
                 └── text2.txt

目标:

.
├── a1
│   ├── file1_unzipped
│   └── text1.txt
└── a2
    ├── file1_unzipped
    └── text2.txt

答案1

1. 解压所有.zip文件

find . -type f -name "*.zip" -exec unzip {} +

解释

  • 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

解释

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

相关内容