cp命令的-d选项和-P选项有何区别?

新手上路,请多包涵

使用cp命令的-d-P选项在创建符号链接的副本时,感觉效果一样,这两个选项的区别在哪里?

root@SEBIA:/home/meerkat# ls -l prog*
-rwxrwxr-x 1 meerkat meerkat 15960 Jun  2 23:12 prog
lrwxrwxrwx 1 root    root        4 Jun  8 22:25 prog1 -> prog
root@SEBIA:/home/meerkat# cp -d prog1 prog2 && cp -P prog1 prog3
root@SEBIA:/home/meerkat# ls -l prog*
-rwxrwxr-x 1 meerkat meerkat 15960 Jun  2 23:12 prog
lrwxrwxrwx 1 root    root        4 Jun  8 22:25 prog1 -> prog
lrwxrwxrwx 1 root    root        4 Jun  8 22:35 prog2 -> prog
lrwxrwxrwx 1 root    root        4 Jun  8 22:35 prog3 -> prog
阅读 2.6k
2 个回答

-P 是 --no-dereference

-d 是 --no-dereference --preserve=links

所以 -d 比 -P 多了 --preserve=links。根据 unix.stackexchange上的这个回答,--preserve=links 不是针对软链接的,而是硬链接。就是一次 cp 的源文件中,如果有两个互为硬链接,那么在拷贝结果中,它使也互为硬链接。

$ date > file1
$ ln file1 file2
$ ls -1i file1 file2
6034008 file1
6034008 file2

file1, file2 inode 相同。(互为硬链接)

$ mkdir dir1
$ cp file1 file2 dir1
$ ls -1i dir1
total 8
6035093 file1
6038175 file2

拷贝后,它们的 inode 不再相同。

$ mkdir dir2
$ cp --preserve=links file1 file2 dir2
$ ls -1i dir2
total 8
6089617 file1
6089617 file2

加上 --preserve=links ,拷贝后它们的 inode 保持相同(互为硬链接)。注意它们与源文件的 inode 是不同的,也就是它们不是源文件原硬链接。

我来打破这个0回答的问题吧,同学你的感觉是没错的,如果源文件本身就是一个符号链接时(划重点:请注意特定环境),-P选项和-d选项之间效果上没有区别的。
当然,效果上没区别并不代表两个选项完全一样,所以这里我介绍一下:
-d选项用于复制符号链接本身,而不是它指向的文件。例如,如果源文件prog1是一个符号链接,则使用-d选项复制时,副本prog2将成为一个指向原始符号链接的新符号链接。
-P选项(或--no-dereference)用于保留符号链接的指向。在上面的示例中,使用-P选项创建了prog3的副本,因此它也是一个指向原始文件prog的新符号链接。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏