我正在尝试用它们指向的文件替换当前目录中的符号链接。我以为我理解了“cp”和“-L”参数,但显然不是。
这是我正在使用的命令
find ./ -maxdepth 1 -type l -regex ".*\(pdf\|odp\)" | xargs readlink -f | xargs cp -Lf -t .
这是我得到的错误
cp: '/home/user/dir1/dir2/dir3/file.pdf' and './file.pdf' are the same file
我错过了什么
-L
主要仅对递归复制有用,因为否则以下符号链接是默认的。并且无论如何你都会将链接的目标传递给它,
cp
所以如果有任何没有遵循目标的符号链接的东西,那么它就cp
不会意识到它是同一个文件,但是-L
//只关心源中的符号链接。-H
-P
在这里,您将遇到 GNU
cp
对源文件和目标文件是否相同进行的额外无关检查。由于-f
目标是符号链接,您可以认为这里存在错误,因为源文件不会受到影响,而目标文件将是不同的文件。您可以改用 busybox
cp
,它不进行该检查并且还支持该 GNU-t
扩展。不需要
readlink
,无论如何,您的方法不适用于带有空格、引号或反斜杠的文件名。如果使用 GNU
find
,您可以添加一个-xtype f
以仅复制最终解析为常规文件的文件,或者如果使用zsh
,您只需执行以下操作:zsh 还具有对其修饰符的内置支持
readlink -f
(或其realpath
标准等效项:P
) ,因此:将使用其真实路径目标复制文件,顺便说一下,这些文件可能有不同的文件名,并且不一定以
.odp
或结尾.pdf
,甚至可以覆盖当前工作目录中不相关的文件,就像如果你有一个file.pdf
->path/to/file.pdf.old
最终会执行cp -f ./file.pdf.old .
并覆盖file.pdf.old
此处一样。