Linux 文件类型

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

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号