You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:编写Bash脚本按WebM文件名归类关联文件至对应目录

问题分析与解决方案

你的脚本出现错误的核心原因有两个:

  1. 当目录中没有对应后缀(如.json、.description)的文件时,通配符*.json会被当作字面量字符串处理,导致尝试创建名为*的目录,若该目录已存在则触发报错。
  2. 重复执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:50:15