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

Ubuntu终端批量重命名多目录文件:避免文件移至主目录

问题原因

你原脚本的问题在于:${file////_}会把文件的完整路径(包含所有目录层级)里的/全部替换成_,得到一个纯文件名(比如FoldersA_sub1_sub2_1.jpg)。而mv命令如果只指定这个纯文件名作为目标,会默认把文件移动到当前工作目录(也就是你运行脚本时所在的目录,比如主目录),这就是文件被提取出来的核心原因。

修改后的脚本(文件保留在原目录)

下面的脚本会将文件重命名为包含目录信息的格式,同时保留在原文件夹中:

for file in Folders*/*/*/*.jpg; do
    # 获取文件所在的目录路径
    file_dir=$(dirname "$file")
    # 获取原文件名(不含路径)
    original_name=$(basename "$file")
    # 将目录路径中的/替换为_,生成带目录信息的前缀
    dir_prefix=${file_dir////_}
    # 拼接最终的新文件名
    new_name="${dir_prefix}_${original_name}"
    # 执行重命名,目标路径为「原目录 + 新文件名」
    mv "$file" "${file_dir}/${new_name}"
done

按需调整细节

如果想修改目录部分的分隔符(比如用-代替_),只需要调整dir_prefix这一行:

# 把目录路径里的/替换成「空格-空格」
dir_prefix=${file_dir//// - }

这样原目录FOLDER A/folder 1会转换为FOLDER A - folder 1,最终文件名就变成FOLDER A - folder 1_1.jpg。

防覆盖提示

如果担心重命名时意外覆盖已有文件,可以增加判断逻辑:

for file in Folders*/*/*/*.jpg; do
    file_dir=$(dirname "$file")
    original_name=$(basename "$file")
    dir_prefix=${file_dir////_}
    new_name="${dir_prefix}_${original_name}"
    new_path="${file_dir}/${new_name}"
    if [ ! -e "$new_path" ]; then
        mv "$file" "$new_path"
    else
        echo "跳过:文件 $new_path 已存在"
    fi
done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:05:37