我使用 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/中搜索,并且由于您已将文件复制到其中,因此find
在temp/文件夹中再次找到它。似乎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
。