在Linux系统中, 一切皆文件,无论是输入命令,还是输出结果,亦或是登录登出等各类操作都会有相对应的文件存在,所以我们需要十分了解文件系统。(本文将以CentOS版本示例)
文件系统目录结构
根目录下查看大致目录结构
[root@bj-test-centos /]# ls /
bin boot data dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
文件系统功能
- /bin 存放基本的用户命令二进制文件,例如常用的 ls、cp、mv 等。
- /sbin 存放管理系统命令二进制文件,例如系统启动与修复等命令。
- /etc 存放全局配置文件和目录,例如网络配置文件
hosts
,hostname
以及服务启动脚本。 - /srv 存放服务相关的数据,例如 web 服务的文档根目录。
- /run 存放系统启动以来的信息文件,包括系统进程的 PID 文件等。
- /opt 用于存放可选的应用软件包。通常用于第三方软件安装。
- /lib 存放系统库文件和内核模块。例如C 语言库文件
libc.so
就在此目录中。 - /tmp 用于存放临时文件,系统启动时可能会清空此目录。
- /proc 一个虚拟文件系统,存放内核和进程信息。
- /root 超级用户家目录,普通用户无法访问,主要存放用户个人文件、配置文件、下载内容等。
- /home 普通用户家目录,超级用户可访问,同样是存放用户个人文件、配置文件、下载内容等。
- /sys 一个虚拟文件系统,存放和系统硬件及系统内核相关的文件。提供设备和内核相关的信息。
- /boot 存放启动加载程序和内核文件,例如
vmlinuz
,initrd.img
等。 - /var 存放动态数据文件,例如日志文件、缓存文件、邮件队列等。子目录包括
log
、spool
和tmp
等。 - /usr 存放用户级应用程序和文件,例如用户命令、库文件、文档等,子目录包括 bin、lib、local 和 share 等。
- /dev 存放设备文件,例如硬盘、终端、打印机等设备接口,例如
/dev/sda
代表第一个 SCSI 硬盘。 /media
和/mnt
用于挂载外部设备,如 USB 驱动器和 CD-ROM。/media
通常用于自动挂载设备,而/mnt
通常用于手动挂载。
常用目录对应的文件类型
文件类型 | 目录路径 |
二进制文件 |
/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
|
库文件 |
/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
|
配置文件 |
/etc, /usr/local/etc
|
帮助文件 |
/usr/share/man, /usr/share/doc, /usr/share/info, /usr/share/help, /usr/share/man_db, /usr/local/share/man, /usr/local/share/doc, /usr/local/share/info
|
了解文件类型
ls -l 查看文件的详细信息,第一列首个字符为文件的标识符,不同的标识符分别代表不同的文件。
[root@bj-test-centos etc]# ls -l
总用量 1484
-rw-r--r--. 1 root root 16 2月 20 16:49 adjtime # - 表示是一个普通文件
drwxr-xr-x. 2 root root 4096 4月 12 19:09 alternatives # d 表示是一个目录文件
lrwxrwxrwx. 1 root root 11 2月 20 16:36 init.d -> rc.d/init.d # l 表示是一个链接文件brw-rw---- 1 root disk 253,0 8月 1 16:31 vda # b 表示是一个块设备文件
crw------- 1 root root 10, 63 8月 1 16:31 vga_arbiter # c 表示是一个字符设备文件
prw------- 1 root root 0 5月 8 08:24 initctl # p 表示是一个管道文件srw-rw-rw- 1 root root 0 8月 1 16:31 rpcbind.sock # s 表示是一个套接字文件
管道文件
管道文件用于进程之间通信和数据处理
[root@bj-test-centos ~]# mkfifo /tmp/myfifo # 创建管道文件
[root@bj-test-centos ~]# echo "Sample data" > /tmp/myfifo # 数据采集进程(模拟)
[root@bj-test-centos ~]# cat /tmp/myfifo | grep "data" # 数据处理进程
Sample data
要注意的是,管道文件的写入和读取需要配合进行,需要打开一个新的终端窗口,才能够读取到正在写入的数据信息。
套接字文件
套接字文件用于本地进程之间的通信和网络服务中,常用与连接数据库、web服务器和应用服务器之间的通信等。
文件操作命令
显示当前路径
[root@bj-test-centos bin]# pwd # 显示当前所在路径
/bin
[root@bj-test-centos bin]# pwd -L # 显示链接路径
/bin
[root@bj-test-centos bin]# pwd -P # 显示实际物理路径
/usr/bin
相对路径和绝对路径
绝对路径是从根目录开始的完整路径
[root@bj-test-centos ~]# cd /usr/local
[root@bj-test-centos local]# pwd
/usr/local
相对路径是相对于当前目录的路径
[root@bj-test-centos local]# cd ..
[root@bj-test-centos usr]#
[root@bj-test-centos usr]# cd ../../
[root@bj-test-centos /]#
[root@bj-test-centos /]# cd root
[root@bj-test-centos ~]#
基名与目录名
基名(basename),只取文件名不要路径
[root@bj-test-centos ~]# basename /tmp/myfifo
myfifo
[root@bj-test-centos ~]# basename http://nginx.org/download/nginx-1.18.0.tar.gz
nginx-1.18.0.tar.gz
[root@bj-test-centos ~]# basename -s .tar.gz http://nginx.org/download/nginx-1.18.0.tar.gz.tar.gz # -s 选项后跟上字符串可去除指定后缀
nginx-1.18.0.tar.gz
目录名(dirname),只取路径不要文件名
[root@bj-test-centos ~]# dirname /tmp/myfifo
/tmp
实际应用
[root@bj-test-centos ~]# url=http://nginx.org/download/nginx-1.18.0.tar.gz # 将url存储到变量中
[root@bj-test-centos ~]# wget $url # 下载
--2024-08-03 14:24:30-- http://nginx.org/download/nginx-1.18.0.tar.gz
正在解析主机 nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:5c0:2601::6, ...
正在连接 nginx.org (nginx.org)|3.125.197.172|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1039530 (1015K) [application/octet-stream]
正在保存至: “nginx-1.18.0.tar.gz”100%[=================================================================================================================>] 1,039,530 1013KB/s 用时 1.0s
2024-08-03 14:24:32 (1013 KB/s) - 已保存 “nginx-1.18.0.tar.gz” [1039530/1039530])
[root@bj-test-centos ~]# tar xf `basename $url` # 将下载好的文件解压到当前目录下
[root@bj-test-centos ~]# ls
2024-07-30.log nginx-1.18.0 nginx-1.18.0.tar.gz release_worweb.sh
列出目录内容
ls可用的选项有很多,以下举例工作中常用到的选项。
[root@bj-test-centos ~]# ls -l # 显示详细的文件信息
总用量 1024
-rw-r--r-- 1 root root 0 7月 30 15:38 2024-07-30.log
[root@bj-test-centos ~]# ls -a # 显示所有文件,包含隐藏文件
. 2024-07-30.log .bash_logout
[root@bj-test-centos ~]# ls -lh # 显示更易懂的文件大小
总用量 1.0M
-rw-r--r-- 1 root root 0 7月 30 15:38 2024-07-30.log
drwxr-xr-x 8 1001 1001 4.0K 4月 21 2020 nginx-1.18.0
[root@bj-test-centos ~]# ls -R # 递归列出所有子目录和文件
.:
2024-07-30.log dayunzi release_worweb.sh./dayunzi:
12138 dajunzi./dayunzi/12138:
[root@bj-test-centos ~]# ls -lt # 按时间排序
总用量 8
drwxr-xr-x 3 root root 4096 8月 3 14:44 dayunzi
-rw-r--r-- 1 root root 0 7月 30 15:38 2024-07-30.log
-rwxr-xr-x 1 root root 304 3月 26 19:07 release_worweb.sh
[root@bj-test-centos ~]# ls -lS # 按大小排序
总用量 8
drwxr-xr-x 3 root root 4096 8月 3 14:44 dayunzi
-rwxr-xr-x 1 root root 304 3月 26 19:07 release_worweb.sh
-rw-r--r-- 1 root root 0 7月 30 15:38 2024-07-30.log
[root@bj-test-centos ~]# ls -i # 显示 inode 号
655696 2024-07-30.log 1049215 dayunzi 655698 release_worweb.sh
查看文件状态
[root@bj-test-centos ~]# stat /tmp/myfifo # 查看文件的元数据,也就是属性(同样可查看目录的元数据)
File: ‘/tmp/myfifo’ # 文件名
Size: 0 Blocks: 0 IO Block: 4096 fifo # 文件大小
Device: fd01h/64769d Inode: 1179666 Links: 1 # 设备
Access: (0644/prw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) # 权限
Access: 2024-08-03 12:59:46.582006282 +0800 # 最近访问
Modify: 2024-08-03 12:59:46.582006282 +0800 # 最近更改
Change: 2024-08-03 12:59:46.582006282 +0800 # 最近改动
Birth: - # 创建时间
[root@bj-test-centos ~]# stat -f /tmp/myfifo # 查看文件所在分区信息
File: "/tmp/myfifo" # 文件
ID: c7c4aaa74df99fa1 Namelen: 255 Type: ext2/ext3 # ID
Block size: 4096 Fundamental block size: 4096 # 块大小
Blocks: Total: 10288203 Free: 9041936 Available: 8566009 # 块
Inodes: Total: 2621440 Free: 2554939
You have new mail in /var/spool/mail/root
[root@bj-test-centos ~]# stat -c "%a-%i-%n" /tmp/myfifo
# 显示文件的权限、inode号、文件名
644-1179666-/tmp/myfifo
确定文件内容
[root@bj-test-centos ~]# file /tmp/myfifo # 确定文件内容
/tmp/myfifo: fifo (named pipe)
windows文本格式和linux文本格式的区别
换行符不同
Line 1\r\n # windows 系统中,以 \r\n 为结尾
Line 2\n # linux 系统中,以 \n 为结尾
文件转换
- dos2unix filename # 在 Linux 上将 Windows 文本文件转换为 Linux 格式
- unix2dos filename # 在 Linux 上将文本文件从 Linux 格式转换为 Windows 格式
文件通配符
常见通配符
* | 匹配0个或多个字符,但不匹配隐藏文件 |
? | 匹配任何单个字符,一个汉字也算一个字符 |
~ | 当前用户家目录 |
. | 当前工作目录 |
~+ | 当前工作目录 |
~- | 前一个工作目录 |
~用户名 | 用户家目录 |
[0-9] | 匹配数字范围 |
[a-z] | 一个字母 |
[A-Z] | 一个字母 |
[wang] | 匹配列表中任意一个字符 |
[^wang] | 匹配列表中所有字符以外的字符 |
[^a-z] | 匹配列表中所有字符以外的字符 |
预定义字符类表示法
[:digit:] | 任意数字,相当于0-9 |
[:lower:] | 任意小写字母,表示 a-z |
[:upper:] | 任意大写字母,表示 A-Z |
[:alpha:] | 任意大小写字吗 |
[:alnum:] | 任意数字或字母 a-z,A-Z,0-9 |
[:blank:] | 水平空白字符 |
[:space:] | 水平或垂直空白字符 |
[:punct:] | 标点符号 |
[:print:] | 可打印字符 |
[:cntrl:] | 控制(非打印)字符 |
[:graph:] | 图形字符 |
[:xdigit:] | 十六进制字符 |