erc*_*rch 5 linux command-line options cp coreutils
该cp命令的info页面提供--preserve=了以下选项:
links
在目标文件中保留相应源文件之间的任何链接。请注意,使用-L' or-H',此选项可以将符号链接转换为硬链接。
接下来是一个我不明白的例子[现在];无论如何:
问题:如何将软链接变成硬链接cp?有没有办法返回[将硬链接转换为软链接]?
次要问题:上面引用中的哪些地方可以发挥作用?我了解-Land的目的-H,我能够复制功能齐全的软链接等,但到目前为止我还没有设法将软链接变成硬链接。
信息页面中的示例向您展示了该示例如何难以理解:
$ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
74161745 a
74161745 b
Run Code Online (Sandbox Code Playgroud)
让我们把它分解成它的组件命令:
mkdir c; : 创建目录 c/: > a;: 只是一种创建空文件的快速方法。它相当于echo "" > a。:是一个内置的 bash,它什么都不做,请参阅help :.ln -s a b: 创建一个a被调用的软链接b。此时,这些是当前目录的内容:
$ ls -l | cc2ter
total 4
-rw-r--r-- 1 terdon terdon 0 Oct 9 02:50 a
lrwxrwxrwx 1 terdon terdon 1 Oct 9 02:50 b -> a
drwxr-xr-x 2 terdon terdon 4096 Oct 9 02:50 c
Run Code Online (Sandbox Code Playgroud)
请注意,这b是一个符号链接(软链接),它不指向与以下相同的 inode a:
$ ls -i1c a b
16647344 a
16647362 b
Run Code Online (Sandbox Code Playgroud)cp -aH a b c;:拷贝文件a和b进入目录c。这是转换发生的地方,传递给的选项cp是:
-a, --archive
same as -dR --preserve=all
-d same as --no-dereference --preserve=links
-H follow command-line symbolic links in SOURCE
Run Code Online (Sandbox Code Playgroud)
该-H是必要的,因为(从info cp):
当从符号链接复制时,`cp' 通常只有在不递归复制时才会跟随链接。
由于-a激活递归复制 ( -R),-H因此需要遵循符号链接。-H意味着尽管进行了递归,但仍会遵循链接,并将导致在目标目录中建立硬链接。这些是c/最后一步之后的内容(第一列是 inode 编号):
$ ls -li c
total 0
17044704 -rw-r--r-- 2 terdon terdon 0 Oct 9 02:50 a
17044704 -rw-r--r-- 2 terdon terdon 0 Oct 9 02:50 b
Run Code Online (Sandbox Code Playgroud)现在至于它的工作原理,据我所知,如果链接和目标都被复制到同一目录,cp --preserve=links结合-L或-H将符号链接转换为硬链接。
事实上,正如 OP发现的那样,至少在 Debian 系统上,cp --preserve=links如果目标目录相同,就足以将符号链接转换为硬链接。