【问题标题】:Copy files of specific type but prevent overwriting files复制特定类型的文件但防止覆盖文件
【发布时间】:2020-12-28 06:38:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您的cp 支持,您可以查看-b/--backup(GNU cp 支持)。
  • @BenjaminW。我在 mac 机器上,我正在使用的 cp 不支持它

标签: bash macos sh


【解决方案1】:

参考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

【讨论】:

  • 如果您绝对确定不会有“奇怪”名称的文件,您可以简化 find/read,但无论哪种方式都可以。
猜你喜欢
  • 1970-01-01
  • 2015-08-26
  • 2014-05-26
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 2017-05-09
相关资源
最近更新 更多