如何修改Bash解压脚本,去除解压后文件夹名前缀的随机数字及下划线
改进后可用的Bash脚本
#!/bin/bash # 切换到存放zip文件的根目录 cd <directory-with-large-number-of-zip-files> || exit 1 # 遍历所有zip文件,-r避免文件名含转义字符时出错 find . -name "*.zip" -type f | while read -r filename; do # 提取当前zip文件所在的目录路径,保留原有层级 file_dir=$(dirname "$filename") # 提取zip的纯文件名(去掉路径和.zip后缀) zip_basename=$(basename "$filename" .zip) # 去除开头的数字+下划线前缀,匹配不到前缀时保留原文件名 cleaned_name=${zip_basename#[0-9]*_} # 拼接得到最终解压目标路径 target_dir="${file_dir}/${cleaned_name}" mkdir -p "$target_dir" # 关闭unar自动创建同名目录的逻辑,直接把内容解压到目标路径 unar -D -o "$target_dir" "$filename" done # 确认解压全部正常后再删除原zip,测试时可先注释该行 find . -name "*.zip" -type f -delete
关键实现逻辑
- 无需重命名原zip文件,直接通过bash内置能力处理文件名,避免修改原文件带来的意外风险
${变量名#匹配规则}是bash原生的前缀截断语法,#[0-9]*_会自动匹配并删除开头的「任意长度数字串+下划线」前缀,无匹配时返回原文件名,兼容性极强- 调整了
unar的参数:将原有的-d(自动创建和压缩包同名的目录)改为-D(不自动创建顶层目录),完全自主控制解压后的目录名,全程保留原有目录层级 - 增加了
cd失败的退出逻辑,避免目录不存在时误操作其他路径下的文件
兼容方案
如果使用的bash版本非常老旧,不支持上述参数扩展语法,可以将cleaned_name=${zip_basename#[0-9]*_}替换为下面的代码,效果完全一致:
cleaned_name=$(echo "$zip_basename" | sed 's/^[0-9]*_//')
内容的提问来源于stack exchange,提问作者Siraj Ahmad
相关产品推荐
相关产品推荐

