将基于正则表达式的文件复制到另一个文件夹,但保持文件夹结构

时间:2019-01-28 11:14:09

标签: copy sh filepath

我想将与正则表达式匹配的文件复制到另一个文件夹,但是在保留一部分文件夹结构的同时,所有文件路径都将以src / main / java /开头,但是大多数文件之前的路径都不相同

我知道我可以使用

find . -iregex ".*HeadersConstants\.java" -exec cp {} ./destination/ \;

要复制文件,但随后我丢失了目标目录中的文件路径

2 个答案:

答案 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。)