我使用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
我收到错误消息。我不明白这种行为。为什么我只想更改名称就会出错?
答案 0 :(得分:2)
这是因为find
首先在 SR0a / 文件夹中搜索,然后在 temp / 中搜索,并且因为您已将文件复制到其中,{ {1}}在 temp / 文件夹中再次创建它。似乎find
使用狡猾的排序,因此在使用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)
是由查找内容引起的,它试图自行复制。
while
和find
命令分隔管道输出cp
与以下选项结合使用:-frpvT
与文件/目录目标路径匹配realpath
,查看文件路径是否相同。find . -iname "*file*" | while read -r f; do echo cp -frpvT "$(realpath $f)" "/temp/$f"; done
如果是这样,请更正文件路径,完成后即可从命令中删除echo
。