如何编写这样一个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中的一句复制到它。