我有find
如下命令,列出匹配的文件:
$ find . -type f -name "*.txt"
./level2/file2.txt
./level2/level3/file3.txt
./level2/level3/level4/file4.txt
./level2/level3/level4/level5/file5.txt
./output.txt
现在我尝试通过以下方式将列出的每个文件复制到特定文件夹exec
:
$ ls copy_here | wc -l
0
$ find . -type f -name "*.txt" -exec cp {} ./copy_here \;
cp: ./copy_here/file2.txt and ./copy_here/file2.txt are identical (not copied).
cp: ./copy_here/file3.txt and ./copy_here/file3.txt are identical (not copied).
cp: ./copy_here/file4.txt and ./copy_here/file4.txt are identical (not copied).
cp: ./copy_here/file5.txt and ./copy_here/file5.txt are identical (not copied).
有人能帮助分解执行顺序以帮助更好地理解执行流程吗?
答案1
这是因为find
执行顺序。您的情况是,首先find
搜索您的levelX
目录,找到.txt
文件并将它们复制到./copy_here
。(顺便说一句,您不应该依赖于发现事物的顺序find
,因此这种错误可能会发生,也可能不会发生。请参阅这。
问题是当find
到达时copy_here
,此时包含先前复制的.txt
文件。find
找到这些文件并尝试将它们复制到同一目录,从而导致上述错误。
为了避免这种情况,您可以./copy_here
从中排除该目录find
:
find -type f -name "*.txt" ! -path "./copy_here*" -exec cp {} ./copy_here \;
(还有其他几种方法可以排除目录和模式)
或者告诉cp
不要覆盖现有文件:
find -type f -name "*.txt" cp -n ./copy_here {} \;