假设我有以下目录树
.
├── a1
│ └── sub1
│ └── a1.zip
└── a2
└── sub2
└── a2.zip
当前目录包含a1
和a2
目录。我想递归搜索、定位和提取所有 zip 文件,并将所有内容分别移动到a1
和a2
。目标状态是:
.
├── 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"*/
– 删除当前处理目录下的所有子目录