首页 > 解决方案 > 如何重命名(通过添加前缀)从当前文件夹开始的所有文件和文件夹?

问题描述

我可以编写以下脚本来完成它。但它并不适合我的情况。

CCUSTOMER_NAME="Abcd"
PATHS=$(find . -name "Template*")

echo $path

for path in $PATHS
do
    name=$(basename $path)
    newname=${CUSTOMER_NAME}"$(echo "$name" | cut -c9-)"
    mv "$name" "$newname"
done

我有一个如下所示的文件夹结构。

-/TemplateProjectA
-/TemplateProjectB
   -/TemplateFiles
     -/TemplateMyFile.xml
-/TemplateProjectC

目前,它给出的输出如下

-/<CUSTOMER_NAME>ProjectA
-/<CUSTOMER_NAME>ProjectB
   -/TemplateFiles
     -/TemplateMyFile.xml
-/<CUSTOMER_NAME>ProjectC

如您所见,它错过了两个文件,给出了以下错误。

mv: cannot stat 'TemplateFiles': No such file or directory
mv: cannot stat 'TemplateMyFile.xml': No such file or directory

原因是,我首先列出以“模板”开头的文件夹/文件的路径。但它首先重命名外部文件夹并且无法找到内部文件/文件夹。我在任何地方都找不到正确描述的类似 sinario。

非常感谢任何帮助!

标签: linuxbashsh

解决方案


可以通过先对所有候选文件/目录进行倒序排序来防止先重命名外部文件夹的问题:

MATCH=Template
REPLACEMENT=Abcd

find -name "${MATCH}*" | sort -r | while read path; do
    newname=$(basename ${path} | sed "s/${MATCH}/${REPLACEMENT}/")
    mv "${path}" "$(dirname ${path})/${newname}"  
done

推荐阅读