使用find -exec复制文件时出现错误消息

时间:2014-02-25 12:23:27

标签: bash find

我使用命令将一些文件从一个目的地复制到另一个目的地。如果我做

$ mkdir dir1 temp
$ touch dir1/dir1-file1
$ find . -iname "*file*" -exec cp {} temp/ \;

一切都按预期正常,但如果我这样做

$ mkdir SR0a temp
$ touch SR0a/SR0a-file1
$ find . -iname "*file*" -exec cp {} temp/ \;
> cp: `./temp/SR0a-file1' and `temp/SR0a-file1' are the same file

我收到错误消息。我不明白这种行为。为什么我只想更改名称就会出错?

3 个答案:

答案 0 :(得分:2)

这是因为find首先在 SR0a / 文件夹中搜索,然后在 temp / 中搜索,并且因为您已将文件复制到其中,{ {1}}在 temp / 文件夹中再次创建它。似乎find使用狡猾的排序,因此在使用时应该考虑到这一点:

find

因此,如果 dir1 / $ mkdir temp dir1 SR0a DIR TEMP $ find . . ./TEMP ./SR0a ./temp ./dir1 ./DIR 首先发现它,并且这不会出现此类问题,请查看搜索顺序:

find

使用 SR0a 进行搜索时,序列为:

temp/
dir1/

所以找到的文件在搜索之前被复制到temp

要解决此问题,请将 temp / 文件夹移到当前文件夹之外:

SR0a/
temp/

或使用管道分隔查找和复制程序:

$ mkdir SR0a ../temp
$ touch SR0a/SR0a-file1
$ find . -iname "*file*" -exec cp {} ../temp/ \;

答案 1 :(得分:0)

此查找应该有效:

find . -path ./temp -prune -o -iname "*file*" -type f -exec cp '{}' temp/ \;

-path ./misc -prune -o用于在将文件复制到临时文件夹时跳过./temp目录。

您的find命令也在查找./temp/*file*个文件,并尝试将它们复制到./temp文件夹中。

答案 2 :(得分:0)

  

是由查找内容引起的,它试图自行复制

  • 使用whilefind命令分隔管道输出
  • cp与以下选项结合使用:-frpvT与文件/目录目标路径匹配
  • 打印输出文件的realpath,查看文件路径是否相同。
find . -iname "*file*" | while read -r f; do echo cp -frpvT "$(realpath $f)" "/temp/$f"; done

如果是这样,请更正文件路径,完成后即可从命令中删除echo