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



我使用 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

我收到一条错误消息。我不理解这种行为。为什么我只是通过更改名称而收到错误?

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

$ mkdir temp dir1 SR0a DIR TEMP
$ find . 
.
./TEMP
./SR0a
./temp
./dir1
./DIR

因此,如果 dir1/ find首先找到了它,并且这不会产生这样的问题,让我们看看搜索顺序:

temp/
dir1/

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

SR0a/
temp/

因此,在搜索之前将找到的文件复制到临时文件中。

要修复它,请将临时/文件夹移到当前文件夹之外:

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

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

$ find . -iname "*file*" | while read -r i; do cp "$i" temp/; done

这个发现应该有效:

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

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

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

它是由试图自行复制到它的发现引起的

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

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

相关内容

  • 没有找到相关文章

最新更新