使用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
-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的新符号链接。