复制特定类型的文件但防止覆盖文件

Copy files of specific type but prevent overwriting files

我需要将特定类型的所有文件复制到一个文件夹,我是这样做的:

find ./ -name '*.gql' -exec cp -prv '{}' '/path/to/dir/' ';'

但如果有两个同名的文件,虽然位于不同的子文件夹中,但有些文件会被覆盖。

是否可以保留所有复制的文件?也许重命名复制的文件或者是否可以将文件夹结构保留在目标目录中?

c.f。 https://ss64.com/osx/cp.html : Historic versions of the cp utility had a -r option...its use is strongly discouraged, as it does not correctly copy special files, symbolic links, or fifo's. 您可以使用 -n 来防止覆盖,但更复杂的逻辑可能需要自定义代码。

dest=/path/to/dir
while IFS= read -r -d '' filename # read null-delimited list from find 
do basename="${filename##*/}"
   if [[ -e "$dest/$basename" ]] 
   then ctr=0
        while [[ -e "$dest/$basename.$((++ctr))" ]]; do : ; done # find available name
        mv "$dest/$basename" "$dest/$basename.$ctr"
   fi
   cp -pv "$filename" "$dest/$basename"     
done < <( find ./ -name '*.gql' -type f -print0 ) # null-delimit