内容概述(文章很长着急可看概述和目录谢谢)
- ** 熟记文件系统目录结构**
- ** 练习文件操作命令**
- ** 理解通配符对(文件名)的作用并熟记**
- ** 理解文件的存储模式和连接文件的关系**
- ** 深度理解输入输出重定向的用法**
1.文件系统目录结构
总结:
【遵循:FH文件系统 : 1.人们在开发的时候为系统能符合更多人使用所以要规定一套。
2.有一些程序开发人员会按照一些规定的目录创建配置文件】
官方网站:https://www.pathname.com/fhs/
1.1文件系统的目录结构
文件和目录被组织成一个单根倒置树结构
文件系统从根目录下开始,用“/”表示
根文件系统(rootfs):root filesystem
标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
以 . 开头的文件为隐藏文件
路径分隔的 /
文件名最长255个字节
包括路径在内文件名称最长4095个字节
蓝色–>目录 绿色–>可执行文件 红色–>压缩文件 浅蓝色–>链接文件 灰色–>其他文件
除了斜杠和NUL,所有字符都有效,但使用特殊字符的目录名和文件不推荐使用,有些字符需要用
引号来引用
每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容
1.2常见的文件系统目录功能
总结:
【/boot内核文件和启动文件目录,/带bin的是命令的储存目录,lib是库文件之后会有程序调用库文件 一般是.so结尾的文件,分强库和弱库】
【home 家目录 root 超级用户目录 ,media 设备挂载点 mnt 临时文件挂载点 (tmp临时文件)】
【/etc 配置文件,dev设备文件,usr相同于快捷方式和/下目录相似,/var下面是可变数据的目录】
【 /proc 输出系统上内核和进程的相关文件的虚拟文件系统 /sys 输出系统上硬件设备的虚拟文件】
1.3 应用程序的组成部分
总结:
【相同的属性目录】注意:只要是程序一般都是有这几个文件
不同类型文件常用的目录,如果查找相关信息多关注这几个文件。
1.4 新版本目录结构变化
总结:
【有些程序员喜欢把文件释放在/bin 但要用的是/usr/bin为了方便程序员所以用了bin】
1.5 Linux下的文件类型
【重要 记住标识 颜色可以不计】
mage@ubuntu22:~$ ls -l /run/
total 20
-rw------- 1 root root 0 Dec 15 07:50 agetty.reload
drwxr-xr-x 3 root root 60 Dec 15 07:50 credentials
-rw-r--r-- 1 root root 4 Dec 15 07:50 crond.pid
---------- 1 root root 0 Dec 15 07:50 crond.reboot
drwx------ 2 root root 40 Dec 15 07:50 cryptsetup
drwxr-xr-x 2 root root 60 Dec 15 07:50 dbus
prw------- 1 root root 0 Dec 15 07:50 dmeventd-client
prw------- 1 root root 0 Dec 15 07:50 dmeventd-server
drwxr-xr-x 2 root root 60 Dec 15 07:50 fsck
prw------- 1 root root 0 Dec 15 07:50 initctl
drwx------ 2 root root 100 Dec 15 07:50 initramfs
drwxr-xr-x 2 root root 60 Dec 15 07:50 irqbalance
drwxrwxrwt 4 root root 80 Dec 15 07:50 lock
drwxr-xr-x 3 root root 60 Dec 15 07:50 log
drwx------ 5 root root 160 Dec 15 07:50 lvm
-rw-r--r-- 1 root root 521 Dec 15 08:50 motd.dynamic
drwxr-xr-x 2 root root 80 Dec 15 07:50 mount
-rw-r--r-- 1 root root 3 Dec 15 07:50 multipathd.pid
drwxr-xr-x 2 root root 40 Dec 15 07:50 sendsigs.omit.d
lrwxrwxrwx 1 root root 8 Dec 15 07:50 shm -> /dev/shm
drwxr-xr-x 4 root root 80 Dec 15 07:50 snapd
srw-rw-rw- 1 root root 0 Dec 15 07:50 snapd-snap.socket
srw-rw-rw- 1 root root 0 Dec 15 07:50 snapd.socket
drwxr-xr-x 2 root root 40 Dec 15 07:50 sshd
-rw-r--r-- 1 root root 4 Dec 15 07:50 sshd.pid
drwx--x--x 2 root root 40 Dec 15 07:50 sudo
drwxr-xr-x 25 root root 600 Dec 15 07:51 systemd
drwxr-xr-x 2 root root 60 Dec 15 07:50 tmpfiles.d
drwxr-xr-x 7 root root 160 Dec 15 07:55 udev
drwx------ 2 root root 40 Dec 15 07:50 udisks2
drwxr-xr-x 3 root root 60 Dec 15 07:51 user
-rw-rw-r-- 1 root utmp 1536 Dec 15 08:50 utmp
drwxr-xr-x 2 root root 60 Dec 15 07:50 uuidd
drwxr-xr-x 2 root root 60 Dec 15 07:50 vmware
总结:
【管道是指两个文件(进程)不同时读写只需要一个读一个写也叫先进先出(first-in first-out)以实现共享文件 套接字文件socket本身有"插座"的意思,在unixlinux环境下,用于表示进程间网络通信的特殊文件类型,本质 为内核借助缓冲区形成的伪文件。】
2.文件操作命令
2.1 显示当前工作目录
mage@ubuntu22:~$ pwd
/home/mage
2.2 绝对和相对路径
总结:
【理解:一个人在3楼,他想去四楼,绝对路径(从“/”出发)是从一楼到再跑到四楼,相对路径是从三楼直接到四楼。(是不是觉得绝对路径很笨,不,这种一种场景)】【如果目标目录 目录在(别的楼)…】
** **描述一个文件位置有两种方式
**绝对路径 **
1. 以正斜杠/ 即根目录开始
2. 描述完整的文件的位置路径
3. 可用于任何想指定一个文件名的时候
**相对路径 **
1. 不以斜线开始,而是以当前所在的位置开始
2. 一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置
3. 可以作为一个简短的形式指定一个文件名
***要去/etc/rpm/***
[root@10 etc]# pwd
/etc
绝对
[root@10 etc]# cd /etc/rpm/
[root@10 rpm]# pwd
/etc/rpm
[root@10 rpm]# cd -
/etc
相对
[root@10 etc]# cd rpm/
[root@10 rpm]# pwd
/etc/rpm
基名 & 目录名
【写脚本会用到】
基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名
[root@10 ~]# basename /etc/rpm/
rpm
[root@10 ~]# dirname /etc/rpm/
/etc
2.3 更改目录
总结:
【cd … cd ~/cd cd - 】 cd -能返回的原因是有一个$OLDPWD在记录
[root@10 ~]# cd ..
[root@10 /]#
[root@10 /]# cd -
/root
[root@10 ~]# cd
[root@10 ~]#
[root@10 ~]#
[root@10 ~]# pwd
/root
[root@10 ~]# cd ..
[root@10 /]# cd -
/root
[root@10 ~]# cd
[root@10 ~]# cd ~
[root@10 ~]#
相关环境变量
2.4 列出目录内容
说明:
1.ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义
2. ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小
3. ll 是 ls命令的一个别名,在centos 和 ubuntu 系统中,该别名的参数不一样
[root@10 ~]# ls
anaconda-ks.cfg bai
[root@10 ~]# ll
total 4
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 Dec 15 21:40 bai
[root@10 ~]# ls -a
. anaconda-ks.cfg .bash_history .bash_profile .cshrc .viminfo
.. bai .bash_logout .bashrc .tcshrc
[root@10 ~]# ls -a
. anaconda-ks.cfg .bash_history .bash_profile .cshrc .viminfo
.. bai .bash_logout .bashrc .tcshrc
修改颜色略
2.5 查看文件状态 stat
【三种状态而已】
[root@10 ~]# stat bai
File: bai
Size: 6 Blocks: 0 IO Block: 4096 directory
Device: fd00h/64768d Inode: 50332607 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-12-15 21:40:52.469595160 +0800
Modify: 2023-12-15 21:40:52.469595160 +0800
Change: 2023-12-15 21:40:52.469595160 +0800
Birth: 2023-12-15 21:40:52.469595160 +0800
2.6 确定文件内容
总结:
【file查看文件类型 -f ,-b , lrzsz 安装bash文件传输 windos可以传输文件到linux下 ,hexdump查看二进制文见内容 ,apt install dos2unix 可以转换文件类型 dos2unix win转Linux unix2win Linux转win 】
结论:window 和 Linux 编码方式不一样 window 多了一个回车(od)可以转换
文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用
[root@ubuntu2204 ~]# cat test.sh
#!/bin/bash
echo "hello world"
[root@ubuntu2204 ~]# file test.sh
test.sh: Bourne-Again shell script, ASCII text executable
[root@ubuntu2204 ~]# file -b test.sh
Bourne-Again shell script, ASCII text executable
[root@ubuntu2204 ~]# cat test.txt
/etc/
/bin
/etc/issue
#从文件中读入
[root@ubuntu2204 ~]# file -f test.txt
/etc/: directory
/bin: symbolic link to usr/bin
/etc/issue: ASCII text
****查看文件类型****
[root@ubuntu2204 ~]# file linux.txt win.txt
linux.txt: ASCII text
win.txt: ASCII text, with CRLF line terminators
[root@ubuntu2204 ~]# ll linux.txt win.txt
-rw-r--r-- 1 root root 6 May 8 17:06 linux.txt
-rw-r--r-- 1 root root 9 May 8 17:07 win.txt
***二进制内容***
[root@ubuntu2204 ~]# hexdump -C linux.txt
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
[root@ubuntu2204 ~]# hexdump -C win.txt
00000000 61 0d 0a 62 0d 0a 63 0d 0a |a..b..c..|
00000009
#安装转换工具
[root@ubuntu2204 ~]# apt install dos2unix
#将Windows的文本格式转换成的Linux文本格式
[root@ubuntu2204 ~]# dos2unix win.txt
dos2unix: converting file win.txt to Unix format...
[root@ubuntu2204 ~]# file win.txt
win.txt: ASCII text
#将Linux的文本格式转换成Windows的文本格式
[root@ubuntu2204 ~]# unix2dos win.txt
unix2dos: converting file win.txt to DOS format...
[root@ubuntu2204 ~]# file win.txt
win.txt: ASCII text, with CRLF line terminators
2.7 文件通配符模式 wildcard pattern
总结:
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
通配符采用特定的符号,表示特定的含义,此特定符号称为元 meta 字符
常见通配符如下:
* #匹配零个或多个字符,但不匹配 “.” 开头的文件,即隐藏文件
? #匹配任何单个字符,一个汉字也算一个字符,
~ #当前用户家目录
. #当前工作目录
~+#当前工作目录
~- #前一个工作目录
~mage #用户mage家目录
[0-9] #匹配数字范围
[a-z] #一个字母
[A-Z] #一个字母
[wang] #匹配列表中的任何的一个字符
[^wang] #匹配列表中的所有字符以外的字符
[^a-z] #匹配列表中的所有字符以外的字符
另外还有在Linux系统中预定义的字符类表示法如下:man 7 glob
[:digit:] #任意数字,相当于0-9
[:lower:] #任意小写字母,表示 a-z
[:upper:] #任意大写字母,表示 A-Z
[:alpha:] #任意大小写字母
[:alnum:] #任意数字或字母a-zA-Z0-9
[:blank:] #水平空白字符
[:space:] #水平或垂直空白字符
[:punct:] #标点符号
[:print:] #可打印字符
[:cntrl:] #控制(非打印)字符
[:graph:] #图形字符
[:xdigit:] #十六进制字符
范例:
#匹配以a开头的
[root@ubuntu2204 ~]# ll a*
#匹配包含a的
[root@ubuntu2204 ~]# ll *a*
#匹配任意单字符文件名的文件
[root@ubuntu2204 ~]# ll ?
-rw-r--r-- 1 root root 0 Jul 10 22:34 a
-rw-r--r-- 1 root root 0 Jul 10 22:34 马
#匹配两个字符
[root@ubuntu2204 ~]# ll ??
-rw-r--r-- 1 root root 0 Jul 10 22:34 ab
-rw-r--r-- 1 root root 0 Jul 10 22:34 马g
-rw-r--r-- 1 root root 0 Jul 10 22:34 马哥
范例: [ ] 和 { }
#rocky8中,[a-z] 表示小a 到小z,大A 到大Y aAbBcC … zZ
#ubuntu2204中,[a-z] 表示 小a 到 小z
***找不到会报错***
[root@ubuntu2204 ~]# ll f{1..5}
ls: cannot access 'f1': No such file or directory
ls: cannot access 'f2': No such file or directory
-rw-r--r-- 1 root root 0 May 8 17:14 f3
-rw-r--r-- 1 root root 0 May 8 17:14 f4
-rw-r--r-- 1 root root 0 May 8 17:14 f5
***不报错***
[root@ubuntu2204 ~]# ll f[1-5]
-rw-r--r-- 1 root root 0 May 8 17:14 f3
-rw-r--r-- 1 root root 0 May 8 17:14 f4
-rw-r--r-- 1 root root 0 May 8 17:14 f5
[root@ubuntu2204 ~]# ls f*
fa fA fb
[root@ubuntu2204 ~]# ls f[a-c]
fa fb
[root@rocky8 ~]# ls f*
fa fA fb
#centos中不区分大小写
[root@rocky8 ~]# ls f[a-c]
fa fA fb
****版本问题****
[root@ubuntu2204 ~]# ll f{a..c}
ls: cannot access 'fc': No such file or directory
-rw-r--r-- 1 root root 0 May 8 17:15 fa
-rw-r--r-- 1 root root 0 May 8 17:15 fb
#rocky8中,[a-z] 表示小a 到小z,大A 到大Y aAbBcC ... zZ
[root@rocky86 ~]# ls test-[a-d].txt
test-a.txt test-A.txt test-b.txt test-B.txt test-c.txt test-C.txt test-d.txt
#ubuntu2204中,[a-z] 表示 小a 到 小z
[root@ubuntu2204 ~]# ls test-[a-d].txt
test-a.txt test-b.txt test-c.txt test-d.txt
[root@rocky86 ~]# touch file{a..z}.txt file{A..Z}.txt file{0..9}.txt
[root@rocky86 ~]# ll file{0..9}.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file0.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file1.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file2.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file3.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file4.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file5.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file6.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file7.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file8.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file9.txt
[root@rocky86 ~]# ll file[0-9].txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file0.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file1.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file2.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file3.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file4.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file5.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file6.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file7.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file8.txt
-rw-r--r-- 1 root root 0 Mar 23 10:46 file9.txt
[root@rocky86 ~]# ls file[a-c].txt
filea.txt fileA.txt fileb.txt fileB.txt filec.txt
[root@rocky86 ~]# ls file[C-E].txt
fileC.txt filed.txt fileD.txt filee.txt fileE.txt
[root@rocky86 ~]# ls file[wang].txt
filea.txt fileg.txt filen.txt filew.txt
[root@rocky86 ~]# ls file[^wang].txt
2.8 创建空文件和刷新时间
touch 命令可以用来创建空文件或刷新文件的时间
#将abc 的时间赋值给abcd
[root@ubuntu2204 ~]# touch -r abc abcd
#将abc 时间设置为7月8日9时10分
[root@ubuntu2204 ~]# touch -t 07080910 abc
2.9复制文件和目录
总结:
【cp 比较重要的选项 -r 递归目录复制 -ib可以一起用 -i是覆盖提示 -b 是被备份 -a保存复制属性 --backup=numbered 可以选择增量复制】
利用 cp(copy)命令可以实现文件或目录的复制
[root@ubuntu2204 ~]# cp ~wang/issue /data/issue_wang.bak
-rw-r--r-- 1 root root 86 Dec 13 16:21 /data/issue_wang.bak
-rw-r--r-- 1 wang wang 86 Dec 13 16:18 /home/wang/issue
#保留属主属组,时间戳
[root@ubuntu2204 ~]# cp -p ~wang/issue /data/issue_wang2.bak
[root@ubuntu2204 ~]# ll ~wang/issue /data/issue_wang2.bak
-rw-r--r-- 1 wang wang 86 Dec 13 16:18 /data/issue_wang2.bak
-rw-r--r-- 1 wang wang 86 Dec 13 16:18 /home/wang/issue
#cp 整个目录
[root@ubuntu2204 ~]# cp /etc/sysconfig/ /data/
cp: -r not specified; omitting directory '/etc/sysconfig/'
[root@ubuntu2204 ~]# cp -r /etc/sysconfig/ /data/
[root@ubuntu2204 ~]# ll /data
total 12
-rw-r--r-- 1 root root 0 Dec 13 16:11 2019-12-12_16:11:48.log
-rw-r--r-- 1 root root 0 Dec 13 16:13 2020-12-13_16:13:11.log
-rw-r--r-- 1 wang wang 86 Dec 13 16:18 issue_wang2.bak
-rw-r--r-- 1 root root 86 Dec 13 16:21 issue_wang.bak
drwxr-xr-x 7 root root 4096 Dec 13 16:23 sysconfig
#备份,并且询问是否覆盖
[root@ubuntu2204 0508]# cp -bi f1.txt f2.txt
cp: overwrite 'f2.txt'? y
[root@ubuntu2204 0508]# ls
f1.txt f2.txt f2.txt~
#保留多版本备份
[root@ubuntu2204 0508]# ls
x.log y.log
[root@ubuntu2204 0508]# ls
x.log y.log
[root@ubuntu2204 0508]# cp --backup=numbered x.log y.log
[root@ubuntu2204 0508]# ls
x.log y.log y.log.~1~
[root@ubuntu2204 0508]# cp --backup=numbered x.log y.log
[root@ubuntu2204 0508]# ls
x.log y.log y.log.~1~ y.log.~2~
范例:特殊文件复制
#不能直接cp ,要加 a 选项
[root@ubuntu2204 ~]# cp /dev/zero{,.bak}
2.10 移动和重命名文件
总结:
【与cp 不同的是不保留源文件 -b 文件是分部分存的】
mv 命令可以实现文件或目录的移动和改名
同一分区移动数据,速度很快,数据位置没有变化
不同分区移动数据,速度相对慢,数据位置发生了变化
[root@ubuntu2204 0508]# ls
a.txt b.txt
#移动前备份
[root@ubuntu2204 0508]# mv -b a.txt b.txt
[root@ubuntu2204 0508]# ls
b.txt b.txt~
#移动多个文件到目录
[root@ubuntu2204 0508]# mv /etc/issue /var/log/syslog ./dira/
[root@ubuntu2204 0508]# ls dira/
issue syslog
#移动前备份
[root@rocky86 ~]# mv -b a a1
#移动多个文件到目录
[root@rocky86 ~]# mv a b c d abcd/
#将 abc目录放入 abcd 目录中,如果 abcd 目录不存在,则将 abc 目录改名为 abcd 目录
[root@rocky86 ~]# mv abc/ abcd
#将 abc 目录下所有内容移动到当前目录
[root@rocky86 ~]# mv abc/* .
M55-Mag
利用 rename 可以批量修改文件名
格式:
2.11 删除文件
总结:
** 【注意:1.我们在删除变量时要注意 例:rm -rf /$PASH 】
【注意:2.我们在删除链接时要注意 例:rm -rf dira.link “/” 这个根号不要加 】
【建议定义别名】【删除特殊符号】**
使用 rm 命令可以删除文件和目录
注意:此命令非常危险,慎重使用,建议使用 mv 代替 rm
实例:
*****删除特殊符号*****
[root@10 ~]# echo sfhsafh >> -f
[root@10 ~]#
[root@10 ~]#
[root@10 ~]# ll
total 24
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
drwxr-xr-x. 5 root root 42 Dec 17 18:46 bai
-rwxrwxrwx. 1 root root 34 Dec 17 14:56 bai.sh
-rw-r--r--. 1 root root 8 Dec 17 20:02 -f
-rw-r--r--. 1 root root 0 Dec 17 16:12 Z
[root@10 ~]#
[root@10 ~]#
[root@10 ~]# rm -rf -f
[root@10 ~]# ll
total 24
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
drwxr-xr-x. 5 root root 42 Dec 17 18:46 bai
-rwxrwxrwx. 1 root root 34 Dec 17 14:56 bai.sh
-rw-r--r--. 1 root root 8 Dec 17 20:02 -f
[root@10 ~]# rm -rf ./-f
[root@10 ~]# ll
total 20
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
drwxr-xr-x. 5 root root 42 Dec 17 18:46 bai
-rwxrwxrwx. 1 root root 34 Dec 17 14:56 bai.sh
2.12 目录操作
2.12.1 显示目录树 tree
总结:
【tree 选项:-f 路径-p 权限】
#显示当前目录的树
[root@ubuntu2204 ~]# tree
[root@ubuntu2204 ~]# tree dir1/
#仅显示两层目录
[root@ubuntu2204 ~]# tree -d -L 2 /
2.12.2 创建目录 mkdir
总结:
【 mkdir 选项 -pv 重要 递归和过程】
3 文件元数据和节点表结构
总结:
【inodem表 块是对应的具体就是inode只想块 删除了内容还可以恢复】
3.1 inode 表结构
在Linux系统中,一切皆文件,
每个文件,又分为文件元数据和具体内容两部份,
一个文件元数据和其具体内容数据,在磁盘分区上,是分开存放的。
这种存储文件元数据的区域就叫 inode,中文译作 “索引节点”,
每个文件都有一个inode和n(n>=1)个block 数据块,inode 存储文件元数据,数据块存储文件具体内容
数据,
磁盘在格式化时,系统会自动将磁盘分为两个区域,
一个是 inode 区(inode table),用来存放文件的 inode,
另一个是数据区,分成很多个block(块),用来存放文件的具体内容数据,
一个磁盘分区上有多少个inode和多少个block,由系统自行决定,跟文件系统,磁盘分区大小,数据块
大小有关,
一个磁盘分区,能存放多少个文件,由文件大小,磁盘分区大小,inode数量决定,
inode 编号可重复使用,当删除一个文件之后,其inode 编号会被回收,供下次新文件使用,
每一个inode表记录对应的保存了以下信息:
inode number(索引节点编号)
文件类型
权限
属主属组
链接数
文件大小
各时间戳
指向具体数据块的指针
有关文件的其他数据
**以指针大小为4字节,block块大小为4KB为前置条件 **
指针大小和block 块大小跟操作系统平台,以及文件系统有关;
**直接指针 **
12个直接指针,直接指向具体数据块,如果block 大小为 4096(4K),则直接指针可以保存 48KB的文件
**间接指针 **
1个间接指针,指向一个数据块,只不过该block上保存的是指针,而不是具体数据
如果block 大小为 4096(4K),一个指针占用4字节,所以此处可以存储 4096/4=1024个 block 地址;
则可以存储的数据大小为 1024*4096=4MB
**双重间接指针 **
1个双重间接指针,指向一个数据块,只不过该block上保存的是指针,而不是具体数据
如果block 大小为 4096(4K),一个指针占用4字节,所以此处可以存储 4096/4=1024个 block 地址;
同理,其指向的 1024个block上,也都是存储的指针地址;
则此处可以存储的数据大小为 1024x1024x4096=4GB
**三重间接指针 **
1个三重间接指针,指向一个数据块,只不过该block上保存的是指针,而不是具体数据
如果block 大小为 4096(4K),一个指针占用4字节,所以此处可以存储 4096/4=1024个 block 地址;
同理,其指向的 1024个block上,也都是存储的指针地址
则此处可以存储的数据大小为 1024x1024x1024x4096=4TB
**单文件最大容量 **
12x直接指针 + 间接指针 + 双重间接指针 + 三重间接指针
**目录 **
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系
文件引用一个是 inode号
人是通过文件名来引用一个文件
一个目录是目录下的文件名和文件inode号之间的映射
inode表和目录
**cp和inode **
cp 命令:
分配一个空闲的inode号,在inode表中生成新条目
在目录中创建一个目录项,将名称与inode编号关联
拷贝数据生成新的文件
**rm和inode **
rm 命令:
链接数递减,从而释放的inode号可以被重用
把数据块放在空闲列表中
删除目录项
数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
**mv和inode **
如果mv命令的目标和源在相同的文件系统,作为mv 命令
用新的文件名创建对应新的目录项
删除旧目录条目对应的旧的文件名
不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
**mv和inode **
如果mv命令的目标和源在相同的文件系统,作为mv 命令
用新的文件名创建对应新的目录项
删除旧目录条目对应的旧的文件名
不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
查看inode号
[root@ubuntu2204 ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
tmpfs 248529 813 247716 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 6488064 128069 6359995 2% /
tmpfs 248529 1 248528 1% /dev/shm
tmpfs 248529 3 248526 1% /run/lock
/dev/sda2 131072 320 130752 1% /boot
tmpfs 49705 26 49679 1% /run/user/0
#查看指定分区
[root@ubuntu2204 ~]# df -i /boot/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 131072 320 130752 1% /boot
删除大文件
[root@ubuntu2204 ~]# cat /dev/null > /var/log/huge.log
3.2 硬(hard)链接
【inode 有一个专门存文件名的inode,去查inodex文件 然后得到inode号就指向了inode详细信息】
【要创建硬链接 :被链接的文件必须存在】 注意:删除软链接时 后面不要加 “/”
hard link
硬链接的作用是允许一个文件拥有多个有效的路径名,
新增一个文件,指向某个文件的inode,这样,这两个文件就互为硬链接,
也就是多个文件名,都是指向同一个inode,这是硬链接的本质。
范例:要创建硬链接 :被链接的文件必须存在
[08:24:57 mage@ubuntu22 ~]$ln bai wang
[08:26:12 mage@ubuntu22 ~]$ll
total 0
-rw-rw-r-- 2 mage mage 0 Dec 30 08:23 bai
-rw-rw-r-- 1 mage mage 0 Dec 30 08:24 bai.log
-rw-rw-r-- 1 mage mage 0 Dec 30 08:24 bai.txt
-rw-rw-r-- 2 mage mage 0 Dec 30 08:23 wang
[08:26:13 mage@ubuntu22 ~]$
[08:26:13 mage@ubuntu22 ~]$echo 厉害>> bai
[08:26:57 mage@ubuntu22 ~]$
[08:26:57 mage@ubuntu22 ~]$cat bai
厉害
[08:27:12 mage@ubuntu22 ~]$cat wang
厉害
[08:27:24 mage@ubuntu22 ~]$ln 111 222
ln: failed to access '111': No such file or directory
总结:
硬链接特性
创建硬链接会在对应的目录中增加额外的记录项以引用文件
对应于同一文件系统上一个物理文件
每个文件引用相同的inode号
创建时链接数递增
删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文
件被删除
不能跨越驱动器或分区
不支持对目录创建硬链接
格式:
[root@ubuntu2204 ~]# cat /dev/null > /var/log/huge.log
ln filename linkname
范例:
# . 表示当前目录,目录名也表示当前目录,所以是有2次引用
# … 表示上级目录,上级目录名引用一次,上级目录中的 . 引用一次,子目录中的 … 引用一次,所是是
3次引用
[root@ubuntu2204 dira]# ll -ai
total 8
395371 drwxr-xr-x 2 root root 4096 May 9 14:34 ./
395370 drwxr-xr-x 3 root root 4096 May 9 14:34 …/
3.3 符号 symbolic (或软 soft)链接
symbolic link,也称为符号链接,类似于windows 中的快捷方式,
软链接是建立一个独立的文件,这个文件的指向的是目标的文件名
总结:
软链接特点
一个符号链接的内容是它引用文件的名称
可以对目录创建软链接
可以跨分区的文件实现
指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的
引用计数
软链接如果使用相对路径,是相对于源文件的路径,而非相对于当前目录
删除软链接本身,不会删除源目录内容
删除源目录的文件,不会删除链接文件
格式:
ln -s filename linkname
范例: 查看软链接
#链接不能是已经存在的
[08:39:55 mage@ubuntu22 ~]KaTeX parse error: Expected 'EOF', got '#' at position 94: …le exists<br />#̲被链接的文件必需是绝对路径的 …ln -s /tmp/bai/ 222222
[08:40:45 mage@ubuntu22 ~]$ll
total 8
lrwxrwxrwx 1 mage mage 9 Dec 30 08:40 222222 -> /tmp/bai/
-rw-rw-r-- 2 mage mage 7 Dec 30 08:26 bai
-rw-rw-r-- 1 mage mage 0 Dec 30 08:24 bai.log
-rw-rw-r-- 1 mage mage 0 Dec 30 08:24 bai.txt
-rw-rw-r-- 2 mage mage 7 Dec 30 08:26 wang
[root@ubuntu2204 ~]# ll /bin/sh
lrwxrwxrwx 1 root root 4 Mar 23 2022 /bin/sh -> dash*
[root@ubuntu2204 ~]# ll /bin
lrwxrwxrwx 1 root root 7 Apr 21 2022 /bin -> usr/bin/
[root@ubuntu2204 ~]# readlink /bin/sh
dash
[root@ubuntu2204 ~]# readlink /bin
usr/bin
范例: 【目标文件路径一定要是是一个准确的路径】
******创建跨目录的软链接时,源文件不能以当前路径为准,要以目标文件的路径为准*****
#错误
[root@ubuntu2204 ~]# ln -sv abc /boot/abc.link
'/boot/abc.link' -> 'abc'
[root@ubuntu2204 ~]# ll /boot/abc.link
lrwxrwxrwx 1 root root 3 May 9 14:37 /boot/abc.link -> abc
[root@ubuntu2204 ~]# cat /boot/abc.link
cat: /boot/abc.link: No such file or directory
#正确
[root@ubuntu2204 ~]# ln -sv /root/abc /boot/abc.link2
'/boot/abc.link2' -> '/root/abc'
[root@ubuntu2204 ~]# ll /boot/abc.link2
lrwxrwxrwx 1 root root 9 Jul 12 15:10 /boot/abc.link2 -> /root/abc
#正确
[[root@ubuntu2204 ~]# ln -sv ../root/abc /boot/abc.link3
'/boot/abc.link3' -> '../root/abc'
[root@ubuntu2204 ~]# ll /boot/abc.link3
lrwxrwxrwx 1 root root 11 Jul 12 15:12 /boot/abc.link3 -> ../root/abc
3.4 硬链接和软链接区别总结
【总结:】
【第二种 虽然把大文件删了但是进程还在占用着文件。 第一把进程关了 第二把先用 cat /dev/null > /var/log/huge.log 把他替了 然后再删除】
4 IO 重定向和管道
**4.1 标准输入和输出 **
Linux 系统中有三个最基本的IO设备
1. 标准输入设备(stdin):对应终端键盘
2. 标准输出设备(stdout):对应终端的显示器
3. 标准错误输出设备(stderr):对应终端的显示器
在Linux系统中,一切皆文件,所以,这三个设备也是以文件的形式存在于系统中;
程序从标准输入文件中获取数据,再将运行结果和错误信息输出到标准输出设备和标准错误输出设备;
在虚拟终端中,标准输入输出设备都是当前的终端窗口
[root@ubuntu2204 ~]# ll /dev/std*
lrwxrwxrwx 1 root root 15 May 9 14:11 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 May 9 14:11 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 May 9 14:11 /dev/stdout -> /proc/self/fd/1
[root@ubuntu2204 ~]# ll /proc/self/fd/
total 0
lrwx------ 1 root root 64 Jul 12 17:47 0 -> /dev/pts/1
lrwx------ 1 root root 64 Jul 12 17:47 1 -> /dev/pts/1
lrwx------ 1 root root 64 Jul 12 17:47 2 -> /dev/pts/1
[root@ubuntu2204 ~]# tty
/dev/pts/0
**4.2 I/O重定向 redirect **
【将标准输出转到别的屏幕标准输出】
重定向:redirect
I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标
输出到另一个终端
**4.2.1 标准输出和错误重新定向 **
总结:
【> ,>> ,2> 2>>, &> ,&>>】
STDOUT和STDERR默认是使用当前终端,但也可以重定向到指定终端或指定文件
格式:
COMMAND OPERATOR FILE|DEVICE
#覆盖操作符,如果文件存在,会被覆盖
> #把STDOUT重定向到文件
1> #同上
2> #把STDERR重定向到文件
&> #把标准输出和错误都重定向
>& #和上面功能一样,建议使用上面方式
#追加操作符,在原有文件的基础上追加内容
>> #追加标准输出重定向至文件
1>> #同上
2>> #追加标准错误重定向至文件
**重定向到设备**
echo "baihaha" >> /dev/pts/3
**重定向到文件**
[root@10 ~]# echo 123 > lll.log
[root@10 ~]# cat lll.log
123
**错误重定向到设备**
[root@10 ~]# echosdfdf 123 2> lll.log
[root@10 ~]# cat lll.log
-bash: echosdfdf: command not found
[root@10 ~]#
**追加**
[root@10 ~]# echo 123 >> lll.log
[root@10 ~]# cat lll.log
-bash: echosdfdf: command not found
123
[root@10 ~]# echodhdf 123 2>> lll.log
[root@10 ~]# cat lll.log
-bash: echosdfdf: command not found
123
-bash: echodhdf: command not found
***错误重定向和输出的重定向写入同一文件***
[root@10 ~]# ls 11.log hdfh 2> 222.log 1>&2
[root@10 ~]#
[root@10 ~]# cat 222.log
ls: cannot access 'hdfh': No such file or directory
11.log
***错误重定向和输出的重定向写入同一文件***
[root@10 ~]# ls 11.log dfh &>>222.log
[root@10 ~]# cat 222.log
ls: cannot access 'hdfh': No such file or directory
11.log
ls: cannot access 'dfh': No such file or directory
11.log
[root@10 ~]# ls 11.log dfh &>222.log
[root@10 ~]# cat 222.log
ls: cannot access 'dfh': No such file or directory
11.log
4.2.2 标准输入重定向
4.2.2.1 tr 命令
总结:
【tr 替换命令 -d删除字符 -c(取反)非替换字符 -s去重 也可以做大小写或字母的替换】
用于转换字符、删除字符和压缩重复的字符。它从标准输入读取数据并将结果输出到标准输出
实例:
****数字替换****
[root@10 ~]# tr 123 abc
123456
abc456
****大小字母替换****
[root@10 ~]# tr a-z A-Z
asdfghjkl
ASDFGHJKL
****-c****
****非123就替换成x****(需要按住ctrl+d)
[root@ubuntu2204 ~]# tr -c 123 x
13579
13xxxx
非2-5的内容替换成 x
[root@ubuntu2204 ~]# tr -c '2-5' x
123456789
x2345xxxxx
***删除2-5***
[root@ubuntu2204 ~]# tr -d '2-5'
1234567
167
***删除大写字母***
[root@ubuntu2204 ~]# tr -d [:upper:]
123abcABC456
123abc456
****将issue文件中的小写字母换成大写,然后重定向输出到文件
[root@ubuntu2204 ~]# tr [:lower:] [:upper:] </etc/issue > tr.tx
***命令重定向***
[root@ubuntu2204 ~]# tr -s ' ' <<<`df
***同上
[root@ubuntu2204 ~]# tr -s ' ' < <(df)
4.2.2.1 标准输入重定向
总结:
**【代替键盘输入(可以写成文件代替输入),单行可以变成文件代替键盘输入,多行可以直接编写多 行代替文件 不是所有的命令都能执行标准输入重定向,支持的特点:**不跟任何选项参数,直接回车,看是否等待标准输入,(可以停留编辑的)例:(cat,bc,mail,tee,)】
标准输入重定向是使用文件来代替键盘的输入,
从文件中读取数据,代替当前终端的输入设备输入的数据,
此处要严格区分命令是否支持标准输入,标准输入和参数是两个概念;
怎么判断命令能使用标准输入重定向?
不跟任何选项参数,直接回车,看是否等待标准输入,如果是,则该命令可以使用标准输入重定向。
格式:
COMMAND 0< FILE
COMMAND < FILE
****输出单用代替手敲****
mage@ubuntu22:~$ cat 333.log
1+2+3+4
mage@ubuntu22:~$ bc < 333.log
10
****输入输出连用***
[root@10 ~]# cat a.txt
1+2+3
[root@10 ~]# bc < a.txt > b.txt
[root@10 ~]# cat b.txt
6
****混合使用****
[root@10 ~]# seq -s + 10 > a.txt; bc< a.txt >b.txt
[root@10 ~]# cat a
anaconda-ks.cfg a.txt
[root@10 ~]# cat a.txt
1+2+3+4+5+6+7+8+9+10
[root@10 ~]# cat b.txt
55
4.2.2.2 标准输入多行重定向
【多用于编写脚本】
使用 “<<终止词” 命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN,
有时被称为就地文本(here documents),其中终止词可以是任何一个或多个符号,比如:!,@,$,
EOF(End Of File),magedu等,其中EOF比较常用
****多行重定向****
mage@ubuntu22:~$ bc <<EOF
66+66
99-8
> EOF
132
91
****用于编写脚本****
mage@ubuntu22:~$ cat > abc.txt <<EOF ****倒因为果 (cat abc.txt 可是EDF还没有输出完整)
> 123
> 123
> 123
> 123
> EOF
4.2.2.4 高级重定向写法
总结:
【相当于把‘’<<< ‘’后面 的当成文件输入】
4.2.2.4.1 cmd <<< “string”
含义是 here-string ,表示传给给cmd的stdin的内容从这里开始是一个字符串。
范例:直接字符串
mage@ubuntu22:~$ cat <<< "abx"
abx
mage@ubuntu22:~$ bc <<< "1+2+3"
6
mage@ubuntu22:~$ tr 'a-z' 'A-Z' <<< 'abcdefghi'
ABCDEFGHI
mage@ubuntu22:~$ tr 'a-z' 'A-Z' <<< `id`
UID=1000(MAGE) GID=1000(MAGE) GROUPS=1000(MAGE),4(ADM),24(CDROM),27(SUDO),30(DIP),46(PLUGDEV),110(LXD
总结:
【】
4.2.2.4.2 cmd1 < <(cmd2)
名称为 Process substitution ,是由两个部分组成
<(cmd2) 表示把cmd2的输出写入一个临时文件, 注意:< 符号 与( 符号之间没有空格
cmd1 < 这是一个标准的stdin重定向
把两个合起来,就是把cmd2的输出stdout传递给cmd1作为输入stdin, 中间通过临时文件做传递
[root@ubuntu2204 ~]# bc < <(echo 1+2+3)
6
[root@ubuntu2204 ~]# bc < <(seq -s + 3)
6
[root@ubuntu2204 ~]# tr 'a-z' 'A-Z' < <(hostname)
ROCKY86
4.3 管道
4.3.1 管道
总结:
【用管道符的前提是前一个命令是(可以)后一个命令的输出(标准输出)】 看管道符时看不懂要分开看
管道(pipe):名顾思义,水管,从一端进去,再从另一端出来。
在shell 中,可以将两个或多个命令(程序|进程)连接起来,将前一个命令的输出作为后一个命令的输入,
就像拿水管将两个命令连起来;
使用管道,要求前一个命令必须支持标准输出,后一个命令必须支持标准输入;
功能说明:
将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
所有命令会在当前shell进程的子shell进程中执行
组合多种工具的功能
[root@ubuntu2204 ~]# echo 1+2+3|bc
6
[root@ubuntu2204 ~]# cat /var/log/syslog | more
[root@ubuntu2204 ~]# ls --help | grep size
[root@ubuntu2204 ~]# echo $PATH | tr ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
/root/bin
#多重管道
[root@ubuntu2204 ~]# echo $PATH | tr ':' '\n' | sort
/bin
/root/bin
/sbin
/snap/bin
/usr/bin
/usr/games
/usr/local/bin
/usr/local/games
/usr/local/sbin
/usr/sbin
#多重管道
[root@ubuntu2204 ~]# ifconfig | head -n 2 | tail -n 1 | tr -s ' ' | cut -d" " -
f3
10.0.0.206
4.3.2 tee 命令
【即写入有输出 -a 不覆盖】
将标准输入复制到每个指定文件,并显示到标准输出
既要又要
格式
tee [OPTION]… [FILE]…
#常用选项
-a|–append #内容追加到给定的文件而非覆盖
-i|–ignore-interrupts #忽略中断信号
-p #对写入非管道的行为排查错误,其使用的是 warn-nopipe
–output-error[=模式] #设置写入出错时的行为 (warn|warn-nopipe|exit|exit
nopipe)
cmd1 | tee [-a ] filename | cmd2
范例:
#接受标准输入,在标准输出上打印,并写文件
[root@ubuntu2204 ~]# tee tee.log
#管道重定向
[root@ubuntu2204 ~]# echo hello | tee tee.log
hello
#tee.log 里面是hello,终端输出是HELLO
[root@ubuntu2204 ~]# echo hello | tee tee.log | tr 'a-z' 'A-Z'
HELLO
#tee.log 和终端输出都是大写
[root@ubuntu2204 ~]# echo hello | tr 'a-z' 'A-Z' | tee tee.log
HELLO
#追加
[root@ubuntu2204 ~]# echo hello | tr 'a-z' 'A-Z' | tee -a tee.log
HELLO
[root@ubuntu2204 ~]# cat <<EOF | tee tee.log
> 123
> 456
> EOF
123
456