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

