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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:54:03