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

