重命名子目录中的所有文件

重命名子目录中的所有文件

我在编写用于批量重命名子目录中的文件的脚本时遇到了问题。

我有一个带有多个子文件夹的文件夹,并且这些子文件夹中有多个我需要重命名的文件。

这是我目前得到的结果:

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只是为了让您尝试一下并检查重命名是否正确 - 您需要将其删除才能允许实际重命名。

相关内容