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

如何用Bash脚本仅修改各级子目录内的文件而不改动文件夹名称

问题原因

原脚本存在两个核心问题导致文件夹被误改:

  • 遍历路径时未过滤文件夹,根目录下的子文件夹也被执行了重命名操作
  • 仅遍历了根目录下的一级内容,无法匹配深层子目录内的mp4文件
  • 多余的首轮全局重命名逻辑,直接修改了所有一级文件/文件夹的名称
调整后脚本

你可以根据是否需要保留mp4在原所属子目录,选择对应版本:

版本1:保留mp4在原目录,仅修改文件名

#!/bin/bash
export FILE_PATH="/path1/path2/path3/"
export even=0
export odd=-1

# 递归查找所有子目录内的mp4文件,自动过滤文件夹
find "$FILE_PATH" -type f -name "*.mp4" | while read -r f; do
    sum=$(sha1sum "$f" | awk '{print $1}')
    # 提取文件所属的原目录路径
    file_dir=$(dirname "$f")
    if [[ "$sum" != "3c72363260a32992c3ab2e3a5e9b8cf082e02b2c" ]]; then
        even=$((even+2))
        new_file="${file_dir}/${even}.mp4"
        echo "$new_file"
        mv "$f" "$new_file"
    else
        odd=$((odd+2))
        new_file="${file_dir}/${odd}.mp4"
        echo "$new_file"
        mv "$f" "$new_file"
    fi
done

版本2:将所有mp4移动到根目录重命名,不保留原目录结构

#!/bin/bash
export FILE_PATH="/path1/path2/path3/"
export even=0
export odd=-1

# 递归查找所有子目录内的mp4文件,自动过滤文件夹
find "$FILE_PATH" -type f -name "*.mp4" | while read -r f; do
    sum=$(sha1sum "$f" | awk '{print $1}')
    if [[ "$sum" != "3c72363260a32992c3ab2e3a5e9b8cf082e02b2c" ]]; then
        even=$((even+2))
        new_file="${FILE_PATH}${even}.mp4"
        echo "$new_file"
        mv "$f" "$new_file"
    else
        odd=$((odd+2))
        new_file="${FILE_PATH}${odd}.mp4"
        echo "$new_file"
        mv "$f" "$new_file"
    fi
done
核心修改说明
  • 移除了原脚本首轮遍历重命名所有一级内容的逻辑,从根源避免文件夹被修改
  • 用find命令替代通配符遍历:-type f仅匹配文件过滤所有文件夹,-name "*.mp4"限制仅处理mp4文件,默认递归遍历所有子目录,可匹配各级子文件夹内的目标文件
  • 路径逻辑可适配两种使用场景,按需选择即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:54:03