我想将与正则表达式匹配的文件复制到另一个文件夹,但是在保留一部分文件夹结构的同时,所有文件路径都将以src / main / java /开头,但是大多数文件之前的路径都不相同
我知道我可以使用
find . -iregex ".*HeadersConstants\.java" -exec cp {} ./destination/ \;
要复制文件,但随后我丢失了目标目录中的文件路径
答案 0 :(得分:0)
与此同时,我使它起作用(可能不是最干净的方法)
javaRe='(.*)\/src\/main\/java\/(.*)\/'
find . -name "HeadersConstants\.java" | while read f
do
if [[ ${f} =~ ${javaRe} ]]; then
path=${BASH_REMATCH[2]}
fullpath=${destination}${srcDir}${path}
mkdir -p "$fullpath"
cp "$f" "$fullpath"
fi
done
答案 1 :(得分:0)
您在Linux上吗?从历史上看,cpio
是一个显而易见的选择,但如今rsync可能会更好:
find . -iregex ".*HeadersConstants\.java" |\
rsync -v --files-from=- ./ ${destination}/
正如您的问题代码所建议的那样,将目的地放在.
内并不是一个好主意,但我们可以停止使用以下方法寻找目的地:
find . -path ./destination -prune \
-o -iregex ".*HeadersConstants\.java" -print |\
rsync -v --file-from=- ./ ./destination/
(您可能想调查为什么需要-print
。)