AngularJS项目中Bash重命名带哈希编译文件的问题求助
修正你的Bash脚本,处理带哈希的AngularJS编译文件
我来帮你逐个解决这两个问题,让脚本能正确批量重命名并移动文件到目标目录。
问题1:多扩展名匹配失败
你尝试用./src/*.{js,css,voff}的写法但报错,主要有两个原因:
- 扩展名拼写错误:
voff应该是woff - Bash默认在通配符无匹配时,会把通配符本身当作字符串输出,导致
cp找不到不存在的./src/*.{js,css,woff}文件
解决方法是启用nullglob选项,让通配符无匹配时返回空值而非原字符串;同时用数组管理扩展名,后续新增类型也更方便。
问题2:cp命令语法错误
原来的cp $files ${DST}"${files//.*}".js有两处问题:
${files//.*}会删掉文件路径中第一个点后的所有内容(比如./src/1.xxx.js会变成./src),再硬加.js就会生成错误的目标路径- 固定写死
.js扩展名,无法处理css、woff等其他类型文件
我们需要先提取纯文件名,再用参数展开正确拆分前缀和扩展名,保留原文件类型。
修正后的完整脚本
#!/bin/bash # 启用nullglob,避免通配符无匹配时输出原字符串 shopt -s nullglob echo "Process web binary files!" # 定义需要处理的扩展名列表,可按需新增 EXTENSIONS=("js" "css" "woff") SRC_DIR="./src/" DST_DIR="./dst/" # 确保目标目录存在,不存在则自动创建 mkdir -p "$DST_DIR" file_count=0 # 遍历每个扩展名,处理对应文件 for ext in "${EXTENSIONS[@]}"; do echo "Processing ${ext} files..." # 匹配当前扩展名的所有源文件 for file in "${SRC_DIR}"*."${ext}"; do # 跳过空值(当该扩展名无文件时) [[ -f "$file" ]] || continue # 提取文件名(不含路径) filename=$(basename "$file") # 重命名逻辑:保留第一个点前的前缀 + 原扩展名 # ${filename%%.*} 取第一个点之前的部分,${filename##*.} 取最后一个点之后的扩展名 new_filename="${filename%%.*}.${filename##*.}" # 复制文件到目标目录 cp "$file" "${DST_DIR}${new_filename}" echo "Processed: $filename -> $new_filename" ((file_count++)) done done echo "Number of target files processed: $file_count"
脚本关键说明
shopt -s nullglob:避免无匹配文件时出现无效路径错误mkdir -p "$DST_DIR":自动创建目标目录,已存在时不会报错- 数组
EXTENSIONS:集中管理扩展名,后续新增类型只需修改这个数组 - 参数展开
${filename%%.*}和${filename##*.}:精准拆分文件名前缀和扩展名,完美匹配你的需求 - 所有变量用双引号包裹:避免文件名含空格或特殊字符时出现异常
测试这个脚本,它会正确处理你给出的所有示例文件,把带哈希的文件名转换成干净的名称并移动到./dst/目录中。
内容的提问来源于stack exchange,提问作者UserM
相关产品推荐
相关产品推荐

