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

Shell脚本case语句中文件名匹配模式失效问题求助

问题分析与修复方案

你的脚本核心问题是case语句中数组的使用方式错误——Bash的case不支持直接用数组作为匹配模式,*."${LIST_DOCS}"这种写法会把数组展开成*.doc docx pdf txt,这不是有效的case匹配格式,导致所有文件都进入默认的others分支。

另外脚本还有几个小问题:echo提示信息错误(比如移动图片时显示"移到documents")、mv命令未加引号(文件名含空格会出错)、mp4格式同时在音频和视频列表里会导致匹配优先级混乱。

下面是修复后的完整脚本:

#!/bin/bash

# 获取当前脚本所在目录
CURR_DIR="$(cd "$(dirname "$0")" && pwd)"
SCRIPT_NAME="$(basename "$0")"

# 定义各类型文件扩展名列表
LIST_DOCS=("doc" "docx" "pdf" "txt")
LIST_IMAGES=("jpg" "jpeg" "png" "gif")
LIST_VIDEOS=("mp4" "avi" "mov" "wmv" "mpeg" "mpg" "m4v" "mkv" "flv" "webm")
LIST_AUDIOS=("mp3" "wav" "ogg" "aac" "m4a" "wma" "aiff" "au" "vox")

# 转换数组为case可用的|分隔匹配模式
PATTERN_DOCS=$(printf "*.%s|" "${LIST_DOCS[@]}")
PATTERN_DOCS=${PATTERN_DOCS%|}  # 移除最后一个多余的|

PATTERN_IMAGES=$(printf "*.%s|" "${LIST_IMAGES[@]}")
PATTERN_IMAGES=${PATTERN_IMAGES%|}

PATTERN_VIDEOS=$(printf "*.%s|" "${LIST_VIDEOS[@]}")
PATTERN_VIDEOS=${PATTERN_VIDEOS%|}

PATTERN_AUDIOS=$(printf "*.%s|" "${LIST_AUDIOS[@]}")
PATTERN_AUDIOS=${PATTERN_AUDIOS%|}

# 创建所需目录(如果不存在)
for dir_name in images videos documents audios others; do 
    [ ! -d "$CURR_DIR/$dir_name" ] && mkdir -p "$CURR_DIR/$dir_name"
done

# 遍历目录下所有文件并分类
for file in "$CURR_DIR"/*; do 
    # 跳过脚本自身和子目录
    if [ "$file" = "$CURR_DIR/$SCRIPT_NAME" ] || [ -d "$file" ]; then
        continue
    fi

    # 匹配文件类型并移动
    case "$file" in 
        $PATTERN_DOCS)
            echo "Moving $file to documents/"
            mv "$file" "$CURR_DIR/documents/"
            ;;
        $PATTERN_IMAGES)
            echo "Moving $file to images/"
            mv "$file" "$CURR_DIR/images/"
            ;;
        $PATTERN_VIDEOS)
            echo "Moving $file to videos/"
            mv "$file" "$CURR_DIR/videos/"
            ;;
        $PATTERN_AUDIOS)
            echo "Moving $file to audios/"
            mv "$file" "$CURR_DIR/audios/"
            ;;
        *)
            echo "Moving $file to others/"
            mv "$file" "$CURR_DIR/others/"
            ;;
    esac
done

echo -e "Your files are now sorted :) \nProcess terminated"

关键修改点说明:

  • 数组转匹配模式:用printf把数组元素拼接成*.ext1|*.ext2|*.ext3的格式,这是case语句能识别的多选项匹配语法。
  • 修正提示信息:每个分支的echo都对应正确的目标目录。
  • 文件名加引号:所有涉及文件路径的变量都用双引号包裹,避免文件名含空格、特殊字符时出错。
  • 调整匹配顺序:把视频列表放在音频前面,因为mp4格式同时属于两者,优先归为视频更合理。
  • 简化目录判断:用[ ! -d ... ] && mkdir -p替代if语句,更简洁。

内容的提问来源于stack exchange,提问作者Mofiro Jean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:24:52