macOS Bash递归给指定扩展名的文件夹添加前缀
给.abc后缀的文件夹批量添加前缀问题
需求:给带有.abc扩展名的文件夹(类似macOS中.app格式的应用包)添加前缀,将OldFileName.abc重命名为AAA_OldFileName.abc,目标文件夹位于/Users/iPPi/PhotoLR的各级子目录中。
尝试的错误脚本:
find /Users/iPPi/PhotoLR -type d -iname '*.abc' | while read d; do echo mv "$d" "AAA_${d%.abc}" mv "$d" "AAA_${d%.abc}" done
问题分析
你的脚本错误在于${d%.abc}会移除整个路径末尾的.abc,导致新路径变成AAA_/Users/iPPi/PhotoLR/xxx/OldFileName——这相当于把文件夹挪到了错误位置,还丢失了.abc后缀。正确逻辑应该是只给文件夹的名称部分添加前缀,保留原路径和后缀。
正确实现方法
方法1:拆分路径与文件名
通过dirname和basename拆分路径和文件名,单独修改文件名部分:
find /Users/iPPi/PhotoLR -type d -iname '*.abc' | while read -r d; do # 获取文件夹所在的父目录 parent_dir=$(dirname "$d") # 获取文件夹的原始名称(包含.abc后缀) original_name=$(basename "$d") # 拼接新名称 new_name="AAA_$original_name" # 先输出测试命令,确认无误再执行实际重命名 echo mv "$d" "$parent_dir/$new_name" # 去掉下面的注释执行实际操作 # mv "$d" "$parent_dir/$new_name" done
方法2:用find的-execdir选项(推荐)
-execdir会自动进入目标文件夹的父目录执行命令,直接操作文件名即可,更简洁可靠:
# 先执行测试命令,确认输出的重命名逻辑正确 find /Users/iPPi/PhotoLR -type d -iname '*.abc' -execdir echo mv '{}' 'AAA_{}' \; # 确认无误后,去掉echo执行实际重命名 # find /Users/iPPi/PhotoLR -type d -iname '*.abc' -execdir mv '{}' 'AAA_{}' \;
注意事项
- 务必先执行带
echo的测试命令,确认输出的重命名路径完全符合预期后,再去掉echo执行实际操作,避免误修改文件位置。 - 如果需要区分大小写匹配(只找
.abc而不是.ABC),把-iname换成-name即可。
内容的提问来源于stack exchange,提问作者iPadawan
相关产品推荐
相关产品推荐

