我正在尝试了解该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 没有做任何事情。