You need to enable JavaScript to run this app. 如何修改Bash解压脚本,去除解压后文件夹名前缀的随机数字及下划线
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 04:45:05