Linux专栏8:Linux 连接文件

linux 连接文件

1 linux 连接文件

Linux有两种连接文件:符号连接(软连接)和硬链接,符号链接类似 Windows 下的快捷方式;硬链接通过文件系统的 inode 连接来产生新文件名,而不是产生新文件。inode:记录文件属性,一个文件一个inode。inode相当于文件ID,查找文件的时候要先找到 inode,然后才能读出文件的内容。

2 ln 命令

ding@ding-ubuntu:~$ ln --help
用法:ln [选项] 源文件 目标文件

必选参数对长短选项同时适用。

  -f, --force	    强制创建连接文件,如果目标存在,那么先删除掉目标文件,然后再建立连接文件
  -s, --symbolic    make symbolic links instead of hard links     // 创建符号链接

3 硬连接

硬连接是多个文件都指向同一个 inode,硬连接知识点:

a) 具有相同 inode 的多个文件互为硬连接文件,创建硬连接相当于文件实体多了入口;

b) 对于硬连接文件,只有删除了源文件以及对应的所有硬连接文件,文件实体才会被删除;

c) 根据硬连接文件的特点,我们可以通过给文件创建硬连接的方式来防止文件误删除;

ding@ding-ubuntu:~$ ls  
hello.c  snap  公共的  模板  软件  视频  图片  文档  下载  音乐  桌面
ding@ding-ubuntu:~$ gcc hello.c -o hello    // 编译 hello.c 文件
ding@ding-ubuntu:~$ ls
hello  hello.c  snap  公共的  模板  软件  视频  图片  文档  下载  音乐  桌面
// 对可执行文件 hello 创建硬连接
ding@ding-ubuntu:~$ ln hello hello1         
ding@ding-ubuntu:~$ ln hello hello2
ding@ding-ubuntu:~$ ls hello*
hello  hello1  hello2  hello.c
ding@ding-ubuntu:~$ ls -l -i hello* 
// ls -i 打印 inode,可以看到,硬连接的 inode 值都相同(1573096)
1573096 -rwxr-xr-x 3 ding ding 8304 2月   9 17:36 hello
1573096 -rwxr-xr-x 3 ding ding 8304 2月   9 17:36 hello1
1573096 -rwxr-xr-x 3 ding ding 8304 2月   9 17:36 hello2
1573092 -rw-r--r-- 1 ding ding  125 2月   9 17:30 hello.c
ding@ding-ubuntu:~$ ./hello2    // 硬连接 hello2 能够执行
hello world!
// 删除源文件 hello,硬连接文件依然存在,且能运行
ding@ding-ubuntu:~$ ls
hello1  hello2  hello.c  snap  公共的  模板  软件  视频  图片  文档  下载  音乐  桌面
ding@ding-ubuntu:~$ ./hello1    // 硬连接文件能够运行
hello world!

d) 不论修改源文件还是连接文件,另一个文件的数据都会被改变;

ding@ding-ubuntu:~$ ln hello.c hello1.c     // 创建 hello.c 的硬连接

ding@ding-ubuntu:~$ gedit hello.c           // 修改 hello.c 源文件
ding@ding-ubuntu:~$ cat hello1.c            
/* hello.c -- 测试文件 */

#include <stdio.h>

int main(int argc, char argv[])
{
	printf("hello world!\r\n");
	printf("修改 hello.c 文件\r\n");        // 连接文件 hello1.c 也被修改
	return 0;
}

e) 硬连接不能跨文件系统;

f) 硬连接不能连接到目录;

因为以上这些限制,硬连接其实不常用。

4 符号连接(软连接)

符号连接类似 Windows 下的快捷方式,符号连接也叫做软连接。符号连接相当于创建了一个独立的文件,这个文件会让数据读取指向它连接的哪个文件的文件名。软连接的特点:

a) 可以连接到目录;   b) 可以跨文件系统;

c) 删除源文件以后,软连接文件也就“打不开了;    d) 符号连接文件通过->来指示具体的连接文件;

ding@ding-ubuntu:~$ ln hello hello1         // 创建硬连接
ding@ding-ubuntu:~$ ln -s hello hello2      // 相对路径创建软连接
ding@ding-ubuntu:~$ ln -s /home/ding/hello /home/ding/hello3    // 绝对路径创建软连接
ding@ding-ubuntu:~$ ls -l -i hello*
// 可以看到,硬连接和源文件有相同的 inode,软连接有独立不同的 inode
1572868 -rwxr-xr-x 2 ding ding 8304 2月   9 18:11 hello
1572868 -rwxr-xr-x 2 ding ding 8304 2月   9 18:11 hello1
1573092 lrwxrwxrwx 1 ding ding    5 2月   9 18:24 hello2 -> hello   // 相对路径软连接
1573102 lrwxrwxrwx 1 ding ding   16 2月   9 18:24 hello3 -> /home/ding/hello    // 绝对路径软连接
1573091 -rw-r--r-- 1 ding ding  163 2月   9 18:10 hello.c
ding@ding-ubuntu:~$ ./hello3                // 软连接一样能运行
hello world!
this is a link-file

注意:符号连接要使用绝对路径,否则连接出问题

在使用 cp 命令拷贝符号连接时,要使用 cp -d 参数,否则会失去符号连接属性;

cp -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;

先看一下硬连接和符号连接的文件大小区别:

// 查看文件大小
ding@ding-ubuntu:~$ du -sh hello*
12K	hello       // 源文件12K
0	hello2      // 符号连接0K,很节省空间
0	hello3
4.0K	hello.c
ding@ding-ubuntu:~$ du -sh hello1
12K	hello1      // 硬连接和源文件同样大小,12K

以下是使用 cp 命令拷贝文件的过程分析:

ding@ding-ubuntu:~$ cp hello2 test/             // 常规拷贝
ding@ding-ubuntu:~$ cp -d hello2 test/hello2-d  // 符号连接拷贝
// 文件类型的区别:
ding@ding-ubuntu:~/test$ ls -l
总用量 12
// 常规拷贝,将 hello2 这个符号连接拷贝成了 可执行文件
-rwxr-xr-x 1 ding ding 8304 2月   9 18:46 hello2  
// -d 拷贝,保持了符号连接属性  
lrwxrwxrwx 1 ding ding    5 2月   9 18:46 hello2-d -> hello
// 文件大小
ding@ding-ubuntu:~/test$ du -sh hello2*
12K	hello2          // 直接拷贝了整个文件
0	hello2-d        // 相对路径符号连接

这里可以看到,cp 一个符号连接,会完成的拷贝源文件,而 cp -d 才会保持文件的符号连接属性。

下面是使用相对路径和绝对路径的拷贝过程:

ding@ding-ubuntu:~$ cp -d hello3 test/hello3-d      // 绝对路径 -d 拷贝
// 文件类型属性
ding@ding-ubuntu:~/test$ ls -l
总用量 12
-rwxr-xr-x 1 ding ding 8304 2月   9 18:46 hello2
lrwxrwxrwx 1 ding ding    5 2月   9 18:46 hello2-d -> hello     // 指向相对路径
lrwxrwxrwx 1 ding ding   16 2月   9 18:52 hello3-d -> /home/ding/hello  // 指向绝对路径
// 文件大小属性
ding@ding-ubuntu:~/test$ du -sh hello*
12K	hello2          // 常规拷贝
0	hello2-d        // 相对路径 -d 拷贝
0	hello3-d        // 绝对路径 -d 拷贝
// 可执行属性
ding@ding-ubuntu:~/test$ ls
hello2  hello2-d  hello3-d
ding@ding-ubuntu:~/test$ ./hello2-d     // 相对路径的符号连接,拷贝后无法执行
bash: ./hello2-d: 没有那个文件或目录
ding@ding-ubuntu:~/test$ ./hello3-d
hello world!                            // 绝对路径的符号连接,拷贝后能够执行
this is a link-file

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值