Contents

将链接转换为常规文件

1. 概述

在本教程中,我们将介绍将链接转换为常规文件的各种方法。当我们想要删除我们创建链接的原始源时,这可能很有用。

2.什么是链接?

Linux 中的链接允许我们将单个文件或目录链接到多个位置。换句话说,它们将使我们能够从我们为其创建链接的各个位置访问单个文件或目录。

让我们以 Linux 发行版为例。许多发行版将目录*/usr/bin* 和*/usr/lib分别链接到/bin/lib*,允许程序使用以 /bin 开头的路径访问*/usr/bin*中的文件。

我们使用ln 命令来创建链接:

$ echo "Hello" > original_file
$ ln -s original_file link_to_file
$ ls -l
total 4
-rw-r--r--    1 blogdemo blogdemo         6 Jan 21 16:29 original_file
lrwxrwxrwx    1 blogdemo blogdemo        13 Jan 21 16:29 link_to_file -> original_file
$ sha256sum original_file 
66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18  original_file
$ sha256sum link_to_file # Points to 'original_file'
66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18  link_to_file

链接在ls 命令输出中用*->*符号表示。

3. 将文件链接转换为文件

我们可以使用各种方法将链接转换为常规文件。主要思想是删除链接并将原始文件复制到同一目标。

3.1. realpathcp命令

我们可以使用realpath 命令来获取原始文件的绝对路径。然后,我们可以将此路径与带有-f*标志的cp 一起使用来复制它并覆盖链接:*

$ ls -l
total 4
-rw-r--r--    1 blogdemo blogdemo         6 Jan 21 16:45 original_file
lrwxrwxrwx    1 blogdemo blogdemo        13 Jan 21 16:39 link_to_file -> original_file
$ cp -f "$(realpath link_to_file)" link_to_file
$ ls -l
total 8
-rw-r--r--    1 blogdemo blogdemo         6 Jan 21 16:45 original_file
-rw-r--r--    1 blogdemo blogdemo         6 Jan 21 16:46 link_to_file
$ cat link_to_file 
Hello

正如我们所见,link_to_file已被转换为常规文件,并且ls不再显示*->*符号。cp还保留文件的原始权限。

3.2. sed命令

sed 命令通常用于编辑文本文件,但我们也可以使用它来复制文件:

$ ls -l
total 4
-rw-r--r--    1 blogdemo blogdemo         6 Jan 21 16:45 original_file
lrwxrwxrwx    1 blogdemo blogdemo        13 Jan 21 17:09 link_to_file -> original_file
$ sed -i ';' link_to_file
$ ls -l
total 8
-rw-r--r--    1 blogdemo blogdemo         6 Jan 21 16:45 original_file
-rw-r--r--    1 blogdemo blogdemo         6 Jan 21 17:10 link_to_file

-i标志使 sed 就地重写文件,而分号表示不执行任何操作。

我们应该注意,sed只复制文件的原始内容,而不是权限或所有权。

4. 将目录链接转换为目录

我们也可以创建指向目录的链接,但是将目录链接转换为常规目录的过程与文件有点不同。

为此,我们可以使用rm命令删除链接并使用cp命令复制原始目录:

$ ls dir/
original_file
$ ls -l
total 0
drwxr-xr-x    2 blogdemo blogdemo        60 Jan 21 17:16 dir
lrwxrwxrwx    1 blogdemo blogdemo         3 Jan 21 17:15 link_to_dir -> dir
$ real_dir="$(realpath link_to_dir)" # Store original path
$ rm link_to_dir
$ cp -LR "$real_dir" link_to_dir
$ ls -l
total 0
drwxr-xr-x    2 blogdemo blogdemo        60 Jan 21 17:16 dir
drwxr-xr-x    2 blogdemo blogdemo        60 Jan 21 17:19 link_to_dir
$ ls link_to_dir/
original_file

在这里,link_to_dir是指向dir目录的链接。我们首先将原始目录的路径存储在一个变量中,然后删除链接并在其位置复制原始目录。最后,我们将*-L-R标志传递给cp*以确保解析所有链接,并递归复制内容。