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
相关产品推荐
相关产品推荐

