cp: `./lcommands/cde.pdf' 和 `lcommands/cde.pdf' 是同一个文件

cp: `./lcommands/cde.pdf' 和 `lcommands/cde.pdf' 是同一个文件

我正在尝试了解该find命令。我想了解此警告的含义:

ankit@battlestar:/home/mount_150/studies$ find -iname "*.pdf" -exec cp -ar {} lcommands/  \;
cp: `./lcommands/june.pdf' and `lcommands/june.pdf' are the same file
cp: `./lcommands/cde.pdf' and `lcommands/cde.pdf' are the same file
cp: `./lcommands/abc.pdf' and `lcommands/abc.pdf' are the same file
ankit@battlestar:/home/mount_150/studies$ ls -l lcommands/

您可以在这里看到我遵循的程序和目录结构:

在此处输入图片描述

答案1

find 命令还会在 lcommand 目录中搜索 pdf 文件的任何实例。由于文件已被复制,因此 pdf 文件被复制到目录中;find 发出了警告。

答案2

Ankid 的回答被接受了,但大部分都是错的。是的,find 也搜索lcommands目录,但正如你从 find 之前的屏幕截图部分看到的那样,lcommands在发出 find 命令之前,目录已经包含三个 pdf 文件。

实际发生的情况:find -exec cp产生命令cp ./lcommands/abc.pdf lcommands/。由于 ./lcommands 恰好是lcommands目录(./与 相同././,与 相同./././././,与您刚才所在的目录相同),因此会导致复制abc.pdf自身,但会cp被拒绝,因为这会导致目标文件损坏(至少对于大于cp缓冲区长度的文件而言)。

想象一下cp它的工作原理:打开源文件,读取一个块,打开目标文件(如果目标文件存在且不为空,则将其截断),将之前读取的块写入目标文件;然后它会读取源文件的下一个块,但由于之前的截断操作,除了第一个块之外的所有内容都消失了。因此,作者cp努力检测源文件和目标文件相同的任何情况。

cp不会抱怨文件已经存在 - 它会很乐意覆盖它!除非你另外使用了选项-i-n。所以jpic 的回答是正确的——即使它可能不是很详细并且因此没有帮助您。

另外两个pdf文件也一样。

尽可能清楚地说明:cp不会因为目标文件存在而发出抱怨,而是因为它(它们)就是源文件。这正是错误消息所说的。

答案3

它是一个错误(返回代码 1),来自cp

>>> cp foo foo
cp: `foo' and `foo' are the same file
<<< 11:33.40 Sat Aug 04 2012!~ 
1

这意味着 cp 没有做任何事情。

相关内容