我在编写用于批量重命名子目录中的文件的脚本时遇到了问题。
我有一个带有多个子文件夹的文件夹,并且这些子文件夹中有多个我需要重命名的文件。
这是我目前得到的结果:
for file in $(find -name "*.report")
do
mv "$file" "LPP_${file/LP_/}"
done
所以正如您所看到的,我需要用“LPP_”替换文件名中的“LP_”字符串。
由于文件路径的原因,此方法不起作用 - 从 find 命令检索到的字符串只是文件名,不包含路径。为了包含路径,我尝试了以下方法:
for file in $(find -name "*.report")
do
echo "$file"
echo "${RELPATH/\$\//}/${file/LP_/LPP_}"
done
但是 RELPATH 变量以 '/' 字符为前缀,因此 mv 命令抱怨它无法将文件移动到 /./subfolder1/LPP_filename.report
有人能告诉我我做错了什么吗,有没有更好的方法,并解释为什么 RELPATH 变量中有一个多余的“/”字符以及如何删除它?
谢谢大家!
答案1
我不太明白你的问题(find
应该返回完整路径),但我建议采用不同的方法,也许像
find -name '*.report' -execdir bash -c 'echo mv "$0" "${0/LP_/LPP_}"' {} \;
通过将find
结果{}
作为 shell 位置参数传递$0
给下级bash -c
命令,我们可以解决无法mv {} ${{}/LP_/LPP_}
直接执行的问题。使用-execdir
而不是更常见的-exec
确保替换仅发生在文件名部分,以防任何路径恰好包含字符串LP_
这echo
只是为了让您尝试一下并检查重命名是否正确 - 您需要将其删除才能允许实际重命名。