为什么在使用“find”进行链接时“cp”会抱怨文件相同?

为什么在使用“find”进行链接时“cp”会抱怨文件相同?

我有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 {} \;

相关内容