点击访问 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 bash
my_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 依旧可以打开,输出内容。