点击访问 Linux 命令大全 >>
在 Linux 中一切都被表示成文件的形式。包括程序进程、硬件设备、通信通道甚至是内核数据结构等。Linux 中一共有7中文件类型,如下表:
| 文件类型 | 符 号 | 文件类型 | 符 号 |
| 普通文件 | - | 本地域套接口 | s |
| 目录 | d | 有名管道 | p |
| 字符设备文件 | c | 符号链接 | l |
| 块设备文件 | b |
我们可以使用 ls -l 或者 ll 命令 查看文件类型。如下:
[snow@localhost ~]$ ll
总用量 4
drwxrwxr-x. 2 root hxstrive.com 6 7月 29 16:37 data
-rwxr-xr--. 1 snow snow 0 7月 29 20:41 test.sh
-rw-rw-r--. 1 root learn 604 7月 29 16:37 test.txt
[snow@localhost ~]$ ls -l
总用量 4
drwxrwxr-x. 2 root hxstrive.com 6 7月 29 16:37 data
-rwxr-xr--. 1 snow snow 0 7月 29 20:41 test.sh
-rw-rw-r--. 1 root learn 604 7月 29 16:37 test.txt上面显示的文件行第一个字符就是文件类型,如 data 目录行的第一个字符为 d(即目录)。而 test.sh 和 test.txt 第一个字符为“-”(普通文件)。
Linux 用设备文件来标识一个特定的硬件设备,主要有两类设备:
字符设备文件:能够从它那里读取成字符序列的设备,有时也称顺序访问设备,必须按照数据发送的顺序来获取,例如:串行线路
块设备文件:用来存储数据并对其各个部分内容提供同等访问权限的设备,有时也称随机访问设备,可以从硬盘的任何随机位置获取数据,例如:磁盘
符号链接(也被称为“软链接”)需要使用 ln -s 命令来创建。例如:下面命令将为 test.sh 创建一个符号链接 my_test.sh,如下:
[snow@localhost ~]$ ls -l
总用量 4
drwxrwxr-x. 2 root hxstrive.com 6 7月 29 16:37 data
lrwxrwxrwx. 1 snow snow 7 7月 30 19:17 my_test.sh -> test.sh
-rwxr-xr--. 1 snow snow 0 7月 29 20:41 test.sh
-rw-rw-r--. 1 root learn 604 7月 29 16:37 test.txt从 my_test.sh 的属性中可以看到,这个文件被指向 test.sh。从此访问 my_test.sh 就相当于访问 test.sh。如下:
[snow@localhost ~]$ ./test.sh
hello bash
[snow@localhost ~]$ ./my_test.sh
hello bash查看 test.sh 和 my_test.sh 文件的内容。如下:
[snow@localhost ~]$ cat test.sh
#/bin/bash
echo hello bash
[snow@localhost ~]$ cat my_test.sh
#/bin/bash
echo hello bashmy_test.sh 只是文件 test.sh 的一个“别名”,因此删除 my_test.sh 并不会影响到 test.sh 文件。但是,如果经 test.sh 文件删除,虽然 my_test.sh 文件还存在,但是已经没有意义了,不能执行。例如:
[snow@localhost ~]$ ll
总用量 8
drwxrwxr-x. 2 snow snow 37 7月 30 19:35 bak
lrwxrwxrwx. 1 snow snow 7 7月 30 19:17 my_test.sh -> test.sh
-rwxr-xr--. 1 snow snow 27 7月 30 19:19 test.sh
-rw-rw-r--. 1 snow snow 604 7月 29 16:37 test.txt
## 删除 my_test.sh 符号链接
[snow@localhost ~]$ rm my_test.sh
## 执行 test.sh 脚本
[snow@localhost ~]$ ./test.sh
hello bash删除 test.sh 文件,然后执行 my_test.sh 符号链接。如下:
## 创建符号链接 my_test.sh
[snow@localhost ~]$ ln -s test.sh my_test.sh
[snow@localhost ~]$ ll
总用量 8
drwxrwxr-x. 2 snow snow 37 7月 30 19:35 bak
lrwxrwxrwx. 1 snow snow 7 7月 30 19:37 my_test.sh -> test.sh
-rwxr-xr--. 1 snow snow 27 7月 30 19:19 test.sh
-rw-rw-r--. 1 snow snow 604 7月 29 16:37 test.txt
## 删除 test.sh 脚本文件
[snow@localhost ~]$ rm test.sh
## 执行符号链接 my_test.sh
[snow@localhost ~]$ ll
总用量 4
drwxrwxr-x. 2 snow snow 37 7月 30 19:35 bak
lrwxrwxrwx. 1 snow snow 7 7月 30 19:37 my_test.sh -> test.sh
-rw-rw-r--. 1 snow snow 604 7月 29 16:37 test.txt
[snow@localhost ~]$ ./my_test.sh
-bash: ./my_test.sh: 没有那个文件或目录符号链接不仅仅能用于文件,还能用于目录。例如:下面命令将 bak 目录创建一个符号链接 my_bak
## 创建目录的符号链接
[snow@localhost ~]$ ln -s /home/snow/bak/ my_bak
## 查看结果
[snow@localhost ~]$ ll
总用量 4
drwxrwxr-x. 2 snow snow 17 7月 30 19:43 bak
lrwxrwxrwx. 1 snow snow 15 7月 30 19:45 my_bak -> /home/snow/bak/
-rw-rw-r--. 1 snow snow 604 7月 29 16:37 test.txt怎样删除目录创建的符号链接呢?直接使用 rm -fr my_bak,而不是 rm -fr my_bak/,如下:
## 删除符号链接 my_bak,删除失败
[snow@localhost ~]$ rm -fr my_bak/
[snow@localhost ~]$ ll
总用量 4
drwxrwxr-x. 2 snow snow 6 7月 30 19:47 bak
lrwxrwxrwx. 1 snow snow 15 7月 30 19:45 my_bak -> /home/snow/bak/
-rw-rw-r--. 1 snow snow 604 7月 29 16:37 test.txt
## 删除符号链接,删除成功
[snow@localhost ~]$ rm -fr my_bak
[snow@localhost ~]$ ll
总用量 4
drwxrwxr-x. 2 snow snow 6 7月 30 19:47 bak
-rw-rw-r--. 1 snow snow 604 7月 29 16:37 test.txt硬链接用于将两个独立的文件联系在一起。硬链接和符号链接区别在于:硬链接是直接引用,而符号链接是通过名称进行引用。使用不带任何选项的 ln 命令建立硬链接,如下:
## 创建硬链接
[snow@localhost ~]$ ln test.txt my_test.txt
[snow@localhost ~]$ ll
总用量 8
drwxrwxr-x. 2 snow snow 6 7月 30 19:47 bak
-rw-rw-r--. 2 snow snow 604 7月 29 16:37 my_test.txt
-rw-rw-r--. 2 snow snow 604 7月 29 16:37 test.txt上面实例中建立了一个链接到 test.txt 的新文件 my_test.txt。根据两者的属性可以看到,这是两个完全独立的文件,只是被联系到一起而已。当你对其中一个文件进行修改,会反映到另一个文件中。
例如:使用 vim 编辑器打开 test.txt 文件,修改 test.txt 文件,然后查看 my_test.txt 文件。
## 查看 test.txt 和 my_test.txt 文件的内容
[snow@localhost ~]$ cat test.txt
hello world
[snow@localhost ~]$ cat my_test.txt
hello world
## 修改 test.txt 文件
[snow@localhost ~]$ echo update file > test.txt
## 查看 test.txt 和 my_test.txt 文件的内容
[snow@localhost ~]$ cat test.txt
update file
[snow@localhost ~]$ cat my_test.txt
update file删除 test.txt 文件,查看删除后对硬链接 my_test.txt 的影响?
## 查看文件信息
[snow@localhost ~]$ ll
总用量 8
drwxrwxr-x. 2 snow snow 6 7月 30 19:47 bak
-rw-rw-r--. 2 snow snow 12 7月 30 19:56 my_test.txt
-rw-rw-r--. 2 snow snow 12 7月 30 19:56 test.txt
## 删除 test.txt 文件
[snow@localhost ~]$ rm test.txt
## 查看文件信息
[snow@localhost ~]$ ll
总用量 4
drwxrwxr-x. 2 snow snow 6 7月 30 19:47 bak
-rw-rw-r--. 1 snow snow 12 7月 30 19:56 my_test.txt
## 查看 my_test.txt 文件内容
[snow@localhost ~]$ cat my_test.txt
update file上面实例中,即使我们删除了 test.txt 文件,但是并没有对 my_test.txt 有任何影响,my_test.txt 依旧可以打开,输出内容。