编写Bash脚本批量查找子目录中的tar.gz并解压至指定目录
Bash脚本:批量查找特定子目录下的tar.gz并统一解压
没问题,我给你写个实用的Bash脚本,完美匹配你的需求——遍历那5000多个文件夹,找到特定子目录里的tar.gz(最多一个),然后统一解压到你指定的目录里。
直接上脚本,你只需要修改开头的三个配置参数就行:
#!/bin/bash # 👇 请根据你的实际情况修改这三个变量 SOURCE_DIR="/path/to/your/main/directory" # 存放5000+文件夹的根目录 TARGET_SUBDIR="specific_subdir" # 要找的那个特定子目录名称 DEST_DIR="/path/to/unified/extract/dir" # 统一解压的目标目录 # 先确保目标解压目录存在,不存在就创建 mkdir -p "$DEST_DIR" # 遍历根目录下的每一个一级文件夹 for folder in "$SOURCE_DIR"/*/; do # 拼接出特定子目录下的tar.gz路径 tar_candidate="$folder$TARGET_SUBDIR"/*.tar.gz # 遍历匹配到的tar.gz(最多一个,符合你的需求) for tar_file in $tar_candidate; do # 确认这个文件真的存在(避免通配符不匹配时的空值) if [ -f "$tar_file" ]; then echo "找到归档文件:$tar_file,正在解压到$DEST_DIR..." # 执行解压,-C指定解压到目标目录 tar -xzf "$tar_file" -C "$DEST_DIR" # 👉 如果解压后想删掉原tar.gz,就取消下面这行的注释 # rm "$tar_file" fi done done echo "所有解压操作完成!"
脚本细节说明
- 参数配置:开头的三个变量是核心,替换成你实际的路径和子目录名称就行。
- 目录创建:
mkdir -p会自动创建目标目录,哪怕它的父目录也不存在,避免报错。 - 遍历逻辑:
"$SOURCE_DIR"/*/只会匹配根目录下的一级文件夹(末尾的/确保不会匹配到文件),符合你“每个文件夹下均有多个子目录”的结构。 - 文件校验:用
[ -f "$tar_file" ]判断,避免当特定子目录里没有tar.gz时,通配符原样返回导致的错误。 - 解压参数:
tar -xzf是处理tar.gz的标准组合,-C指定解压到目标目录,不会把文件散得到处都是。
进阶优化(更快的并行处理)
如果觉得串行遍历5000+文件夹太慢,可以用parallel工具并行解压,效率会提升很多。先安装parallel(比如Ubuntu用apt install parallel,Mac用brew install parallel),然后用下面的命令替代整个循环:
find "$SOURCE_DIR" -maxdepth 2 -type f -path "*/$TARGET_SUBDIR/*.tar.gz" | parallel tar -xzf {} -C "$DEST_DIR"
这个命令用find直接定位所有符合条件的tar.gz,然后交给parallel同时处理多个解压任务,速度快不少。
注意事项
- 确保你对源目录有读取权限,对目标解压目录有写入权限,遇到权限问题可以考虑加
sudo(谨慎使用)。 - 脚本里用了双引号包裹所有路径变量,所以即使文件夹/文件名包含空格、特殊字符(除了换行)也能正常处理。
内容的提问来源于stack exchange,提问作者jlnkls
相关产品推荐
相关产品推荐

