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

Mac下按文件名日期结构分类媒体文件的Bash脚本故障排查

解决Mac Bash 3.2下按文件名日期分类媒体文件的问题

常见脚本失效原因排查

  • 正则匹配不兼容:Bash 3.2的=~正则语法不支持部分新特性,比如非捕获组,容易导致日期提取失败
  • 未处理文件扩展名:比如文件名是20240520_123456.jpg,脚本若只匹配纯数字部分会忽略扩展名,导致过滤不到文件
  • 权限不足:创建文件夹或移动文件时没有读写权限,操作被静默拒绝
  • 文件遍历逻辑错误:脚本未覆盖目标文件,比如只处理了特定扩展名,或未跳过目录
  • 日期格式转换错误:字符串截取语法有误,导致生成的文件夹名格式不对

适配Bash 3.2的正确脚本

以下脚本针对Bash 3.2的特性优化,确保稳定运行:

#!/bin/bash

# 遍历当前目录下符合YYYYMMDD_HHMMSS格式的所有媒体文件
for file in *[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9]*; do
    # 跳过目录,只处理文件
    if [ -d "$file" ]; then
        continue
    fi

    # 用sed提取文件名中的8位日期部分,规避Bash 3.2正则兼容性问题
    date_part=$(echo "$file" | sed -n 's/^\([0-9]\{8\}\)_.*$/\1/p')
    # 跳过不符合格式的文件
    if [ -z "$date_part" ]; then
        continue
    fi

    # 转换为YYYY-MM-DD格式的文件夹名
    folder_name="${date_part:0:4}-${date_part:4:2}-${date_part:6:2}"

    # 自动创建文件夹(不存在时)
    mkdir -p "$folder_name"

    # 移动文件到对应文件夹,-v参数显示操作过程方便排查
    mv -v "$file" "$folder_name/"
done

额外优化方案

如果需要处理子目录中的文件,可改用find遍历:

find . -type f -name "*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9]*" | while read -r file; do
    filename=$(basename "$file")
    date_part=$(echo "$filename" | sed -n 's/^\([0-9]\{8\}\)_.*$/\1/p')
    if [ -z "$date_part" ]; then
        continue
    fi
    folder_name="${date_part:0:4}-${date_part:4:2}-${date_part:6:2}"
    mkdir -p "$folder_name"
    mv -v "$file" "$folder_name/"
done

注意事项

  • 运行脚本前可将mv -v改为echo mv -v,先预览操作,避免误移动文件
  • 若需限定处理特定扩展名,可修改遍历模式,比如*.jpg *.jpeg *.png *.mov *.mp4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:43:23