Linux基础03 绝对/相对路径,cd/mkdir/touch/tree/cp命令, 文件系统目录,stat/file命令,文件通配符,文件元数据和节点表结构
文件路径定位
1.绝对路径
完整的路径,以'/'开头的路径,都是绝对路径
2.相对路径
不以'/'开头的路径
. :当前目录
.. :上级目录
#相对路径
[root@oldboyedu usr]# cd ./local/
[root@oldboyedu /etc/sysconfig]# cd ../ssh/
[root@oldboyedu /etc/ssh]# cd ../../bin
#绝对路径
[zls@oldboyedu local]$ cd ~/oldboy/ # cd /root/oldboy
#绝对路径
[root@db04 /]# ls /home/oldboy/
[root@db04 /]# ls /root/
[root@db04 /]# ls ~/file1
[root@db04 /]# ls ~/zls/file1
#相对路径
[root@db04 /]# ls abc
[root@db04 /]# ls ../abc
[root@db04 /]# ls abc/file1
显示当前工作目录 pwd命令
pwd [-LP] #常用选项 -P #显示真实物理路径 -L #显示链接路径(默认)
[root@ubuntu2204 ~]# pwd /root [root@ubuntu2204 ~]# cd /bin [root@ubuntu2204 bin]# pwd /bin [root@ubuntu2204 bin]# pwd -L /bin [root@ubuntu2204 bin]# pwd -P /usr/bin
基名 & 目录名
基名:basename,只取文件名而不要路径 目录名:dirname,只取路径,不要文件名 [root@ubuntu2204 ~]# basename /etc/apt/apt.conf.d/ apt.conf.d [root@ubuntu2204 ~]# dirname /etc/apt/apt.conf.d/ /etc/apt [root@ubuntu2204 ~]# basename http://nginx.org/download/nginx-1.18.0.tar.gz nginx-1.18.0.tar.gz [root@ubuntu2204 ~]# basename http://nginx.org/download/nginx-1.18.0.tar.gz.tar.gz nginx-1.18.0.tar.gz.tar.gz [root@ubuntu2204 ~]# basename -s .tar.gz http://nginx.org/download/nginx-1.18.0.tar.gz nginx-1.18.0 [root@ubuntu2204 ~]# basename -s .tar.gz http://nginx.org/download/nginx-1.18.0.tar.gz.tar.gz nginx-1.18.0.tar.gz [root@ubuntu2204 ~]# url=http://nginx.org/download/nginx-1.18.0.tar.gz [root@ubuntu2204 ~]# wget $url [root@ubuntu2204 ~]# tar xf `basename $url`
切换目录 cd命令
cd cd [目录名] cd - : 返回上一次进入的目录 cd ~ :进入当前用户家目录 cd . :进入当前目录 cd .. :返回上一级目录 cd :进入当前用户的家目录 cd ~/oldboy
创建目录 mkdir命令
语法: mkdir [选项] 目录名 #make directory 注意:不加任何选项的情况下,只能在已有的目录下创建目录 建议:创建目录时尽量加上-p选项(就算存在该目录也不会覆盖) -m, 创建目录时,指定权限(很少用,几乎不用) -p, 如果目录已存在则不报错,递归创建 -v, 打印出创建过程信息
{} 创建多个目录 权限: r:read 读 w:write 写 x:exec 执行 目录权限:755 文件权限:644 mkdir -m 644 /dir111 # 创建644权限的目录 /oldboy/oldboy1/你的名字 #创建多个目录 [root@oldboyedu ~]# mkdir /dir1 /dir2 /dir3 [root@oldboyedu ~]# mkdir /dir{4..10} # 创建dir4到10多个文件夹 [root@oldboyedu ~]# mkdir /home/zls/{dir1,dir2,dir3} # 或者是 /dir{1,2,3} [root@oldboyedu ~]# mkdir /home/zls/dir{1..3}/oldboy1 -pv mkdir: created directory ‘/home/zls/dir1’ mkdir: created directory ‘/home/zls/dir1/oldboy1’ mkdir: created directory ‘/home/zls/dir2’ mkdir: created directory ‘/home/zls/dir2/oldboy1’ mkdir: created directory ‘/home/zls/dir3’ mkdir: created directory ‘/home/zls/dir3/oldboy1’ mkdir /home/{zls,abc/{1..3}/zls} /abc -pv # 创建/home/zls, /home/abc/1..., /abc #报错 [root@oldboyedu ~]# mkdir /dir4 mkdir: cannot(不能) create(创建) directory(目录) ‘/dir4’: File(文件) exists(存在) [root@oldboyedu ~]# mkdir /dir11/oldboy #没有这个文件 或者 目录 mkdir: cannot create directory ‘/dir11/oldboy’: No such file or directory
创建文件 touch命令
touch 命令可以用来创建空文件或刷新文件的时间
touch 语法: touch [选项]... 文件名...
{} 创建多个文件 [root@oldboyedu ~]# touch abc [root@oldboyedu ~]# touch /oldboyedu1/abc touch: cannot touch ‘/oldboyedu1/abc’: No such file or directory 1.创建的文件,必须在已存在的目录下 2.文件已存在的情况下,不会报错,会修改文件的创建时间 3.源文件内容不会被覆盖 4.对目录也可以操作,不会报错,修改创建时间(Linux中,一切皆文件) [root@oldboyedu ~]# touch 123 456 789 [root@oldboyedu ~]# touch def hig /usr/local/src/abc [root@oldboyedu ~]# touch /usr/local/src/{abc,def,hig}
#常用选项 -a #改变atime,ctime -m #改变mtime,ctime -h|--no-dereference #touch链接文件时,默认是操作其指向的目标文件,此选项表示操作链 接文件本身 -r|--reference #使用某个文件的访问时间和修改时间作为当前文件的访问时间和修改时 间 -d|--date #指定修改时间和访问时间,而不是采用当前系统时间 -t [[CC]YY]MMDDhhmm[.ss] # --time=WORD --time=STRING #指定修改项 access|atime 等同于 -a, modify|mtime 等同于 -m -c|--no-create #如果文件不存在,不创建 [root@ubuntu2204 ~]# touch -d "2022-05-05 05:05:05" abc #将abc 的时间赋值给abcd [root@ubuntu2204 ~]# touch -r abc abcd #刷新文件时间(访问时间,2个修改时间都会变),文件内容还在 [root@ubuntu ~]#stat 1.txt File: 1.txt Size: 4 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 524297 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2024-06-30 22:36:24.215111958 +0800 Modify: 2024-06-30 22:36:03.743060200 +0800 Change: 2024-06-30 22:36:03.743060200 +0800 Birth: 2024-06-30 22:35:53.219033593 +0800 [root@ubuntu ~]#touch 1.txt [root@ubuntu ~]#stat 1.txt File: 1.txt Size: 4 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 524297 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2024-06-30 22:37:44.431314534 +0800 Modify: 2024-06-30 22:37:44.431314534 +0800 Change: 2024-06-30 22:37:44.431314534 +0800 Birth: 2024-06-30 22:35:53.219033593 +0800 #注意文件属性中,Access访问时间不是实时刷新,有特殊机制 1.上一次的atime 到当前超过24H,再访问会更新 atime 2.mtime 或者 ctime 大于 atime,再访问会更新 atime 因为 atime,ctime,mtime 更新都需要消耗IO资源 而在一个系统中,大多数文件,都是读多写少,如果每一次访问(读)文件都要更新atime,则会家中系统负载
以树状形式显示目录结构tree
tree -L:指定层级(level) -d:只查看目录
-f:只显示文件信息
-a:显示所有文件信息
-F: 给目录加上一个标识符
如果没有需要安装:yum install tree -y [root@oldboyedu ~]# tree . ├── 123 ├── 456 ├── 789 ├── abc ├── anaconda-ks.cfg ├── check_student.sh ├── def ├── hig ├── oldboy ├── student.txt └── zls └── zls1 └── zls2 [root@oldboyedu ~]# tree -L 2 /usr/local/ # 看两层结构 /usr/local/ ├── abc ├── bin ├── etc ├── games ├── include ├── lib ├── lib64 ├── libexec ├── sbin ├── share │ ├── applications │ ├── info │ └── man └── src ├── abc ├── def ├── hig └── zls123 [root@oldboyedu ~]# tree -L 2 -d /usr/local/ # -d只显示目录
复制cp
cp:复制(copy) -r:递归拷贝,拷贝目录 -p:保持源文件的属性(例如时间属性) -a:拷贝目录并保持属性,递归复制(代替-rp参数) -v:显示复制的过程 -t:交换目标和源文件的位置
-i:提示文件存在时是否覆盖(系统默认别名有)
-b: 先备份再覆盖 语法: cp [OPTION]... 源文件 目标 cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE... [root@oldboyedu ~]# cp oldboy /usr/ cp: omitting directory ‘oldboy’ [root@oldboyedu ~]# cp -v 123 456 789 /opt/ # 把123,456,789拷贝到/opt/文件夹中 ‘123’ -> ‘/opt/123’ ‘456’ -> ‘/opt/456’ ‘789’ -> ‘/opt/789’ 1.cp可以修改名字,指定的目录不存在,即改名 cp /tmp/a1/{abc,ccc} # 等于 cp /tmp/a1/abc /tmp/a1/ccc cp /tmp/a1/abc{,.txt} # 等于 cp /tmp/a1/{abc,abc.txt},复制一个abc.txt文件 cp /tmp/a1/abc{,-txt} # 等于 cp /tmp/a1/{abc,abc-txt},复制一个abc-txt文件
特殊文件复制要加-a
[root@ubuntu ~]# cp /dev/zero zero #会不断往zero写0,文件越来越大 #这样才能复制一个相同文件 [root@ubuntu ~]# cp -a /dev/zero zero2
文件系统目录结构
文件和目录被组织成一个单根倒置树结构 文件系统从根目录下开始,用“/”表示 根文件系统(rootfs):root filesystem 标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL 以 . 开头的文件为隐藏文件 路径分隔的 / 文件名最长255个字节 包括路径在内文件名称最长4095个字节 蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件 除了斜杠和NUL,所有字符都有效,但使用特殊字符的目录名和文件不推荐使用,有些字符需要用 引号来引用 每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容
#查看文件元数据(属性) [root@ubuntu boot]#stat vmlinuz-5.15.0-113-generic File: vmlinuz-5.15.0-113-generic Size: 11681992 Blocks: 22824 IO Block: 4096 regular file Device: 802h/2050d Inode: 17 Links: 1 Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2024-06-29 11:44:22.389001852 +0800 Modify: 2024-06-10 16:00:37.000000000 +0800 Change: 2024-06-29 11:44:06.964159863 +0800 Birth: 2024-06-29 11:44:06.892155742 +0800
常见的文件系统目录功能
/boot #引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放 于此目录 /bin #所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序 /sbin #管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序 /lib #启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules) /lib64 #专用于x86_64系统上的辅助共享库文件存放位置 /etc #配置文件目录 /home/USERNAME #普通用户家目录 /root #管理员的家目录 /media #便携式移动设备挂载点 /mnt #临时文件系统挂载点 /dev #设备文件及特殊文件存储位置, b:block device,随机访问,c:character device,线性访问 /opt #第三方应用程序的安装位置 /srv #系统上运行的服务用到的数据 /tmp #临时文件存储位置 /usr #universal shared, read-only data /usr/bin #保证系统拥有完整功能而提供的应用程序 /usr/sbin #同上 /usr/lib #32位使用 /usr/lib64 #只存在64位系统/usr/include #C程序的头文件(header files) /usr/share #结构化独立的数据,例如doc, man等 /var #variable data files,可变数据目录 /var/cache #应用程序缓存数据目录 /var/lib #应用程序状态信息数据 /var/local #专用于为/usr/local下的应用程序存储可变数据 /var/lock #锁文件 /var/log #日志目录及文件 /var/opt #专用于为/opt下的应用程序存储可变数据 /var/run #运行中的进程相关数据,通常用于存储进程pid文件 /var/spool #应用程序数据池 /var/tmp #保存系统两次重启之间产生的临时数据 /proc #用于输出内核与进程信息相关的虚拟文件系统 /sys #用于输出当前系统上硬件设备相关信息虚拟文件系统 /selinux #security enhanced Linux,selinux相关的安全策略等信息的存储位置
/proc/ 其实是内存映射在文件上,里面是假文件,大小为0 /sys/ 也是内存映射的数据 [root@ubuntu boot]#ls /proc/ #里面的数字对应下面的进程号(进程消失,数字消失) 1 113 126 150 200 211 230 273 298 311 442 8 868 acpi fb locks softirqs 10 114 127 153 201 212 233 275 299 312 5 81 87 asound filesystems mdstat stat 100 115 128 154 202 213 235 276 3 313 515 82 870 bootconfig fs ... [root@ubuntu boot]#pstree -p #{}包住的是线程,没有{}的是进程 systemd(1)─┬─ModemManager(893)(进程)─┬─{ModemManager}(919)(线程) │ └─{ModemManager}(923)(线程) ├─VGAuthService(738)(进程) ├─agetty(877) ├─cron(853)
应用程序的组成部分
新版本目录结构变化
- /bin 和 /usr/bin
- /sbin 和 /usr/sbin
- /lib 和/usr/lib
- /lib64 和 /usr/lib64
文件类型
#块设备通常是存储设备 #字符设备通常是输入设备 管道文件是单向的 套接字文件是双向的 cd - #去上一个目录(实际是去$OLDPWD这个路径,如果修改该变量,那么就去修改的路径下)
查看文件状态 stat
一个文件有两部份信息:元数据和具体内容
查看文件元数据
stat [OPTION]... FILE... #常用选项 -t|--terse #使用简洁格式显示 -f|--file-system #显示相关的文件系统信息,所谓文件系统,对应的就是windows下面的硬盘分区 -c|--format #使用特定格式输出
每个文件有三个时间戳属性
#查看文件元数据 [root@ubuntu mage]#stat /etc/fstab File: /etc/fstab Size: 657 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 393921 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2024-06-29 11:44:35.817676731 +0800 Modify: 2024-06-29 11:44:24.645118846 +0800 Change: 2024-06-29 11:44:24.645118846 +0800 Birth: 2024-06-29 11:44:24.645118846 +0800 #Links 链接数 #access time 最后访问时间间 #modify time 最后内容更改时间 #change time 最后属性改动时间 #Birth time 文件创建时间 #目录也是一个文件 [root@ubuntu2204 ~]# stat /boot/
确定文件内容file
文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用
file [options] <filename>... #常用选项 -b|--brief #只显示结果,不显示文件名 -f|--files-from FILE #从指定文件中获取要处理的文件名 -F|--separator STRING #指定分割符 -L|--dereference #跟随软链接
[root@ubuntu2204 ~]# file test.sh test.sh: Bourne-Again shell script, ASCII text executable
文件通配符
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件 通配符采用特定的符号,表示特定的含义,此特定符号称为元 meta 字符
常见的通配符如下:
* #匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件 ? #匹配任何单个字符,一个汉字也算一个字符, ~ #当前用户家目录 . #当前工作目录 ~+ #当前工作目录 ~- #前一个工作目录 ~mage #用户mage家目录 [0-9] #匹配数字范围 [a-z] #一个字母 [A-Z] #一个字母 [wang] #匹配列表中的任何的一个字符 [^wang] #匹配列表中的所有字符以外的字符 [^a-z] #匹配列表中的所有字符以外的字符
另外还有在Linux系统中预定义的字符类表示法如下:
[: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 马哥 # [ ] 和 { } [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 #centos里的顺序是 aAbB...zZ, 所以会匹配到大小写(ubantu正常区分大小写,因为bash版本不同,centos的系统旧) [root@rocky boot]# ls f[a-c] fa fA fb [root@ubuntu ~]# ls [0-9a-zA-Z] #匹配0-9或a-z或A-Z一个字符 #离散匹配 [root@ubuntu ~]# ls f[acf] #匹配fa或者fc或者ff,[]里表示任意匹配一个字符 #以y或者t开头,.txt结尾 [root@ubuntu ~]# ls [yt]*.txt #取反 [root@ubuntu ~]# ls z[^A-C] #z第二个字符不要ABC [root@ubuntu ~]# ls z[^AC] #z第二个字符不要AC [root@ubuntu ~]# ls z[^0-9A-D] #z第二个字符不要0-9和A-D #注意下面用法,外面要套[],否则就是离散匹配 [root@ubuntu ~]# ls z[[:digit:]] 相当于z[0-9],匹配z第二个字符0-9
文件元数据和节点表结构
inode 表结构
在Linux系统中,一切皆文件, 每个文件,又分为文件元数据和具体内容两部份, 一个文件元数据和其具体内容数据,在磁盘分区上,是分开存放的。 这种存储文件元数据的区域就叫 inode,中文译作 "索引节点", 每个文件都有一个inode和n(n>=1)个block 数据块,inode 存储文件元数据,数据块存储文件具体内容 数据, 磁盘在格式化时,系统会自动将磁盘分为两个区域, 一个是 inode 区(inode table),用来存放文件的 inode, 另一个是数据区,分成很多个block(块),用来存放文件的具体内容数据, 一个磁盘分区上有多少个inode和多少个block,由系统自行决定,跟文件系统,磁盘分区大小,数据块 大小有关, 一个磁盘分区,能存放多少个文件,由文件大小,磁盘分区大小,inode数量决定, inode 编号可重复使用,当删除一个文件之后,其inode 编号会被回收,供下次新文件使用
每一个inode表记录对应的保存了以下信息:
inode number(索引节点编号)
文件类型
权限
属主属组
链接数
文件大小
各时间戳
指向具体数据块的指针
有关文件的其他数据
#inode号用完就没法创了 #查看文件inode号 [root@rocky ~]# ls -li total 8 34048542 -rw-------. 1 root root 1247 Jun 28 23:48 anaconda-ks.cfg 18447809 drwxr-xr-x. 2 root root 6 Jun 28 23:49 Desktop #inode号:18447809 18447812 drwxr-xr-x. 2 root root 6 Jun 28 23:49 Documents 35131543 drwxr-xr-x. 2 root root 6 Jun 28 23:49 Downloads #每个inode保存的元数据 [root@rocky ~]# stat /etc/fstab File: /etc/fstab Size: 579 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 16777347 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:etc_t:s0 Access: 2024-07-01 08:45:34.368564816 +0800 Modify: 2024-06-28 23:38:08.567445098 +0800 Change: 2024-06-28 23:48:17.508124459 +0800 Birth: 2024-06-28 23:38:08.567445098 +0800 #占657字节,一个IO块(IO Block)占4k。所以这个文件占一个块。IO Block还有一层512,所以Blocks是8 #文件名不在元数据中,在路径中。目录是特殊文件,先找到/etc的inode,从它的块信息中,找到fstab的inode,再找对应的块信息
查看文件系统类型
[root@ubuntu2204 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on tmpfs tmpfs 195M 1.3M 193M 1% /run /dev/mapper/ubuntu--vg-ubuntu--lv ext4 97G 5.9G 87G 7% / tmpfs tmpfs 971M 0 971M 0% /dev/shm tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock /dev/sda2 ext4 2.0G 250M 1.6G 14% /boot tmpfs tmpfs 195M 4.0K 195M 1% /run/user/0 [root@ubuntu2204 ~]# cat /etc/fstab /dev/disk/by-id/dm-uuid-LVM2DfhG2JAeOckxicJorCIykZWj5F57OAw1wUxIh2DKVkhusX3fhgEVlJJIPV3tnGn / ext4 defaults 0 1 # /boot was on /dev/sda2 during curtin installation /dev/disk/by-uuid/195992f6-95be-4629-b331-8fb09cf99819 /boot ext4 defaults 0 1 /swap.img none swap sw 0 0
查看分区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 M57-Magedu /dev/sda2 131072 320 130752 1% /boot
查看文件inode
[root@ubuntu2204 ~]# ll -i ab 395359 -rw-r--r-- 1 root root 0 May 8 17:13 ab [root@ubuntu2204 ~]# stat ab
inode编号耗尽 & 磁盘打满
#分区越大,可用的节点编号就越多,当前分区有多少个节点编号,就是说能在当前分区上创建多少个文件 #如果当前分区上的节点编号用光,则无法再创建新文件,系统会提示 “No space left on device” #如果当前分区上的空间用光,同样无法创建新文件,系统同样提示 “No space left on device” echo test-{1..523977}.txt | xargs touch #创建大量空文件耗尽inode号 cp /dev/zero /tmp/ #创真实大文件把硬盘打满 df -i #查看磁盘分区inode编号使用情况 df -lh #查看磁盘分区使用情况 删除大文件 [root@ubuntu2204 ~]# cat /dev/null > /var/log/huge.log