如何编写这样一个bash脚本来搜索、重命名和替换文件

如何编写这样一个bash脚本来搜索、重命名和替换文件,bash,shell,Bash,Shell,我在源文件夹中有一大堆文件需要更新到目标文件夹。源文件夹中的布局是平面的,没有子目录,例如: src\a.h \a.c \b.h \b.c \c.h \c.c dst\App\a.h \App\a.c \USBD\CDC\b.h \USBD\CDC\b.c \USBH\CORE\FUNCTION\c.h \USBH\CORE\FUNCTION\c.h 目标文件夹包含多层深层子目录,例如: src\a.h \a.c \b.

我在源文件夹中有一大堆文件需要更新到目标文件夹。源文件夹中的布局是平面的,没有子目录,例如:

src\a.h
   \a.c
   \b.h
   \b.c
   \c.h
   \c.c
dst\App\a.h
   \App\a.c
   \USBD\CDC\b.h
   \USBD\CDC\b.c
   \USBH\CORE\FUNCTION\c.h
   \USBH\CORE\FUNCTION\c.h
目标文件夹包含多层深层子目录,例如:

src\a.h
   \a.c
   \b.h
   \b.c
   \c.h
   \c.c
dst\App\a.h
   \App\a.c
   \USBD\CDC\b.h
   \USBD\CDC\b.c
   \USBH\CORE\FUNCTION\c.h
   \USBH\CORE\FUNCTION\c.h
我需要递归搜索“dst”目录中的所有文件,如果其中任何文件与“src”目录中的任何文件匹配,则将“dst”中的文件重命名为XX.sav(XX是原始名称),并将该文件从“dst”复制到“src”


谢谢

假设您确实要从
src
复制到
dst
,并且
src
dst
是同级,并且该命令是从公共父目录运行的,请尝试:

find dst -type f -exec sh -c 'test -f src/${0##*/} && 
    { mv $0 $0.sav && cp src/${0##*/} $0; }' {} \;
如果最后两个假设不正确,请尝试(未测试):


您应该小心:如果在
dst
中存在任何
.sav
文件,它们可能会被覆盖,如果在
src
中存在任何
.sav
文件,您可能会在dst中得到与此命令本身创建的相关
.sav
文件重复的
.sav
文件。使用
mv-i
解决这些相关问题。如果现有文件数量较多,
mv-i
可能不是合适的解决方案。

有几个步骤可以找到问题的解决方案

首先,您需要遍历
src
文件夹中的所有文件,以确保知道在
dst
中查找什么。在bash中可以很容易地做到这一点,如下所示:

for filename in src/*
do
    echo "$filename" # simple sanity check
done
现在您已经知道了要查找的内容,可以使用命令
find
尝试在
dst
中查找文件。由于此命令本身启用递归查找,因此不需要执行任何特殊操作。但是,您可能需要查找文件名,而不是包含目录结构的整个路径。这样的办法应该行得通

for filename in src/*
do
    pattern=$(basename $filename) # remove folder from filename
    for another_filename in $(find dst -name "$pattern")
    do
        echo "$filename -> $another_filename" # another sanity check
    done
done
现在您有了一个来自
src
的文件与来自
dst
的文件相匹配,您只需使用
cp
mv
即可实现所需的功能


这远不是最短的解决方案,但一旦您了解了所需的命令,它应该很容易理解和改进。

最后一句是否正确,或者您想将src中的一句复制到dst吗?@williampersell我需要先备份dst中的一句,然后将src中的一句复制到它。