You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Bash脚本将子文件夹内RAR文件解压至对应同名子文件夹?

批量解压子文件夹中的RAR文件到对应同名子文件夹

你需要的是遍历指定根目录下所有子文件夹中的RAR文件,将每个RAR解压到它所在子文件夹下与子文件夹同名的新文件夹中(比如/folder/sub-folder1/file1.rar最终解压到/folder/sub-folder1/sub-folder1/)。下面是修改后的脚本,同时修复了原脚本中处理特殊文件名的隐患:

#!/bin/bash
# 替换为你的根文件夹路径,比如 /folder
loc="/folder"

# 安全遍历所有RAR文件,处理含空格/特殊字符的文件名
find "$loc" -name '*.rar' -print0 | while IFS= read -r -d '' archive; do
    # 获取当前RAR文件所在的目录
    archive_dir=$(dirname "$archive")
    # 生成目标文件夹路径:RAR所在目录 + 该目录的名称
    target_folder="$archive_dir/$(basename "$archive_dir")"
    
    # 创建目标文件夹(-p确保不会因目录已存在报错)
    mkdir -p "$target_folder"
    
    # 解压文件到目标文件夹
    # 👉 说明:
    # - unrar x:保留归档内的目录结构(推荐)
    # - 如果不需要保留结构,换成 unrar e
    # - -y:自动覆盖已存在文件,无需手动确认,可按需移除
    unrar x -y "$archive" "$target_folder/"
    
    echo "Extracted $archive to $target_folder"
done

关键修改说明

  1. 安全处理特殊文件名:
    原脚本用for archive in "$(find ...)"的写法会把所有RAR路径合并成一个字符串,遇到文件名含空格、特殊字符时直接出错。改用find -print0配合while read -d ''是Linux下处理文件路径的标准安全写法,能兼容所有合法文件名。

  2. 正确生成目标路径:
    通过dirname "$archive"拿到RAR所在的子文件夹路径,再用basename "$archive_dir"取出该子文件夹的名称,最终拼接出子文件夹路径/子文件夹名称的目标目录,完全匹配你的需求。

  3. 增强鲁棒性:
    用mkdir -p代替原脚本的mkdir,即使目标文件夹已经存在也不会报错,避免脚本中断。

可选优化:跳过已解压的文件夹

如果不想重复解压已经处理过的文件夹,可以在解压前加判断,比如检查目标文件夹是否为空:

#!/bin/bash
loc="/folder"

find "$loc" -name '*.rar' -print0 | while IFS= read -r -d '' archive; do
    archive_dir=$(dirname "$archive")
    target_folder="$archive_dir/$(basename "$archive_dir")"
    
    if [ ! -d "$target_folder" ] || [ -z "$(ls -A "$target_folder")" ]; then
        mkdir -p "$target_folder"
        unrar x -y "$archive" "$target_folder/"
        echo "Extracted $archive to $target_folder"
    else
        echo "Skipping $archive: $target_folder is not empty"
    fi
done

内容的提问来源于stack exchange,提问作者Binson_Buzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:02:48