如何修改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
关键修改说明
安全处理特殊文件名:
原脚本用for archive in "$(find ...)"的写法会把所有RAR路径合并成一个字符串,遇到文件名含空格、特殊字符时直接出错。改用find -print0配合while read -d ''是Linux下处理文件路径的标准安全写法,能兼容所有合法文件名。正确生成目标路径:
通过dirname "$archive"拿到RAR所在的子文件夹路径,再用basename "$archive_dir"取出该子文件夹的名称,最终拼接出子文件夹路径/子文件夹名称的目标目录,完全匹配你的需求。增强鲁棒性:
用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
相关产品推荐
相关产品推荐

