当前位置: 首页 > 知识库问答 >
问题:

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

宗波涛
2023-06-09

使用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个答案

谭昊乾
2023-06-09

-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 是不同的,也就是它们不是源文件原硬链接。

易宣
2023-06-09

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

 类似资料:
  • Node.js 自带了各种命令行选项。 这些选项开放了内置的调试、执行脚本的多种方式、以及其他有用的运行时选项。运行 man node 可在一个终端中查看操作手册。 概要 node [options] [v8 options] [script.js | -e "script" | -] [--] [arguments] node debug [script.js | -e "script" | <

  • Shebang 行 几乎每个 Perl 程序都如此开始: #!/usr/bin/perl 这是 UNIX 结构,它告诉 Shell 直接执行余下的输入程序文件。 你可以在此行添加 Perl 的任何命令行选项,它们将成为选项之后命令行的一部分。 如果你有一个程序包含: #!/usr/bin/perl -T 然后执行: perl -l program.pl -l 和 -T 两个选项都会使用,但

  • 本文向大家介绍linux中install命令和cp命令的使用与区别,包括了linux中install命令和cp命令的使用与区别的使用技巧和注意事项,需要的朋友参考一下 前言 install和cp类似,都可以将文件/目录拷贝到指定的地点。但是,install允许你控制目标文件的属性。install通常用于程序的makefile(在RPM的spec里面也经常用到),使用它来将程序拷贝到目标(安装)目录

  • Ruby 一般是从命令行运行,方式如下: 解释器可以通过下列选项被调用,来控制解释器的环境和行为。 选项 描述 -a 与 -n 或 -p 一起使用时,可以打开自动拆分模式(auto split mode)。请查看 -n 和 -p 选项。 -c 只检查语法,不执行程序。 -C dir 在执行前改变目录(等价于 -X)。 -d 启用调试模式(等价于 -debug)。 -F pat 指定 pat 作为默

  • Envoy由JSON配置文件以及一组命令行选项驱动。以下是Envoy支持的命令行选项。 -c \, --config-path \ (必选)指向v1或v2 JSON/YAML/proto3配置文件)的路径。若设置-v2-config-only选项,则将被解析为一个v2引导配置文件,如果是v1 JSON配置文件,则返回失败。对于v2配置文件,有效的扩展名是.json,.yaml,.pb和.pb_te