需求:编写Bash脚本按WebM文件名归类关联文件至对应目录
问题分析与解决方案
你的脚本出现错误的核心原因有两个:
- 当目录中没有对应后缀(如
.json、.description)的文件时,通配符*.json会被当作字面量字符串处理,导致尝试创建名为*的目录,若该目录已存在则触发报错。 - 重复执行
mkdir命令,处理WebM文件时已创建目标目录,后续处理关联文件时再次执行mkdir会因目录已存在而终止脚本(因为你设置了errexit)。
下面是优化后的脚本,仅基于WebM文件的文件名创建目录,并批量移动所有同名关联文件:
方案一:自动匹配所有同名关联文件
#!/bin/bash # 启用严格模式:遇错误退出、禁止未定义变量、无匹配时通配符为空 set -o errexit -o nounset -o nullglob # 遍历所有WebM文件 for webm_file in *.webm; do # 提取不带后缀的基础文件名作为目录名 dir_name="${webm_file%.webm}" # 创建目录(-p确保目录已存在时不报错,--避免目录名以-开头导致参数解析问题) mkdir -p -- "$dir_name" # 移动WebM文件到目标目录 mv -- "$webm_file" "$dir_name/" # 移动所有同名关联文件(如.description、.info.json),无匹配时忽略错误 mv -- "$dir_name".* "$dir_name/" 2>/dev/null || true done
方案二:指定关联文件后缀(更可控)
如果你只想处理特定类型的关联文件,可使用此版本:
#!/bin/bash set -o errexit -o nounset -o nullglob # 定义需要处理的关联文件后缀 declare -a assoc_exts=(.description .info.json) for webm_file in *.webm; do dir_name="${webm_file%.webm}" mkdir -p -- "$dir_name" # 移动WebM文件 mv -- "$webm_file" "$dir_name/" # 遍历指定后缀,移动存在的关联文件 for ext in "${assoc_exts[@]}"; do assoc_file="${dir_name}${ext}" if [[ -f "$assoc_file" ]]; then mv -- "$assoc_file" "$dir_name/" fi done done
关键优化点说明
set -o nullglob:当通配符没有匹配到任何文件时,会展开为空字符串,避免把*.json这类无匹配的通配符当作文件名处理。mkdir -p:确保目录已存在时不会抛出错误,无需重复判断目录是否存在。2>/dev/null || true:忽略移动无匹配文件时的错误信息,避免脚本因errexit设置而意外终止。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

