如何编写Shell脚本按文件名前缀将NT_/ET_开头的MP4移动到指定文件夹
Shell按文件名前缀分类移动MP4文件实现方案
错误原因说明
你之前的逻辑错误核心是Shell中直接使用if $fname=NT_*.mp4这种写法时,NT_*.mp4的通配符会被提前展开为当前目录下匹配的所有文件名,不会作为前缀匹配规则对单个文件名做判断,因此会出现所有文件都匹配第一个条件的问题。
批量处理现有文件方案
该方案适合一次性处理源目录下所有已存在的符合要求的文件:
#!/bin/bash # 自定义配置区,替换为你实际的路径 TARGET_NT="/预定义的/folder1绝对路径" TARGET_ET="/预定义的/folder2绝对路径" SOURCE_DIR="/转码输出文件夹的绝对路径" # 自动创建目标文件夹(不存在时) mkdir -p "$TARGET_NT" "$TARGET_ET" # 切换到源目录避免路径处理错误 cd "$SOURCE_DIR" || { echo "源目录不存在,退出"; exit 1; } # 遍历所有mp4文件逐个判断 for fname in *.mp4; do # 跳过非文件项(避免无mp4文件时*通配符不展开的异常) [ -f "$fname" ] || continue # 匹配NT_前缀文件 if [[ $fname == NT_*.mp4 ]]; then mv -- "$fname" "$TARGET_NT/" # 匹配ET_前缀文件 elif [[ $fname == ET_*.mp4 ]]; then mv -- "$fname" "$TARGET_ET/" fi done
关键注意点
- 匹配判断必须使用Bash扩展语法
[[ ]],该语法下通配符不会提前展开,可以正确做单文件名的模式匹配 - 所有变量用双引号包裹,避免文件名包含空格、特殊字符时执行报错
mv命令后的--用于兼容以-开头的文件名,避免系统将文件名识别为命令参数- 测试时可以先将
mv替换为echo mv,确认输出的移动命令符合预期后再改回正式执行
实时处理新传入文件方案
如果需要监听转码目录的新文件,自动完成移动,可以使用inotifywait实现实时触发,需要先安装对应工具:
- Debian/Ubuntu系执行:
apt install inotify-tools - RHEL/CentOS系执行:
yum install inotify-tools
监控脚本示例:
#!/bin/bash TARGET_NT="/预定义的/folder1绝对路径" TARGET_ET="/预定义的/folder2绝对路径" SOURCE_DIR="/转码输出文件夹的绝对路径" mkdir -p "$TARGET_NT" "$TARGET_ET" # 监听文件写入完成事件,避免移动未完成转码的文件 inotifywait -m -e close_write --format '%f' "$SOURCE_DIR" | while read -r fname; do [[ $fname != *.mp4 ]] && continue if [[ $fname == NT_*.mp4 ]]; then mv -- "$SOURCE_DIR/$fname" "$TARGET_NT/" elif [[ $fname == ET_*.mp4 ]]; then mv -- "$SOURCE_DIR/$fname" "$TARGET_ET/" fi done
内容的提问来源于stack exchange,提问作者Mikael Johnasson
相关产品推荐
相关产品推荐

