1 文件系统目录结构
1.1文件系统的目录结构
- 文件和目录被组织成一个单根倒置树结构
- 文件系统从根目录下开始,用“/”表示
- 根文件系统(rootfs):root filesystem
- 标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
- 以 . 开头的文件为隐藏文件
- 路径分隔的 /
- 文件名最长255个字节
- 包括路径在内文件名称最长4095个字节
- 蓝色–>目录 绿色–>可执行文件 红色–>压缩文件 浅蓝色–>链接文件 灰色–>其他文件
- 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
- 每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容
1.2 常见的文件系统目录功能
- /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
- bin: 保证系统拥有完整功能而提供的应用程序
- lib:32位使用
- lib64:只存在64位系统
- include: C程序的头文件(header files)
- share:结构化独立的数据,例如doc, man等
- local:第三方应用程序的安装位置
- /var: variable data files
- cache: 应用程序缓存数据目录
- lib: 应用程序状态信息数据
- local:专用于为/usr/local下的应用程序存储可变数据
- lock: 锁文件
- opt: 专用于为/opt下的应用程序存储可变数据
- run: 运行中的进程相关数据,通常用于存储进程pid文件
- spool: 应用程序数据池
- tmp: 保存系统两次重启之间产生的临时数据
- /proc: 用于输出内核与进程信息相关的虚拟文件系统
- /sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
- /selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置
1.3 应用程序的组成部分
- 二进制程序:/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, /etc/DIRECTORY, /usr/local/etc
- 帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc
1.4 Linux下的文件类型
- -普通文件
- d 目录文件directory
- b 块设备block
- c 字符设备character
- l 符号链接文件link
- p 管道文件pipe
-
- s 套接字文件socket
2 文件操作命令
2.1 显示当前工作目录
每个shell和系统进程都有一个当前的工作目录 CWD:current work directory
显示当前shell CWD的绝对路径:
pwd命令: printing working directory
-P 显示真实物理路径
-L 显示链接路径(默认)
2.2 绝对和相对路径
- 绝对路径
以正斜杠/ 即根目录开始
完整的文件的位置路径
可用于任何想指定一个文件名的时候
- 相对路径名
不以斜线开始
指定相对于当前工作目录或某目录的位置
可以作为一个简短的形式指定一个文件名
基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名
2.3 更改目录
命令 cd : change directory 改变目录
选项:-P 切换至物理路径,而非软链接目录
可以使用绝对或相对路径
- 切换至父目录: cd …
- 切换至当前用户主目录: cd
- 切换至以前的工作目录: cd -
2.4 列出目录内容
ls 命令可以列出当前目录的内容或指定目录
常见选项:
-a 包含隐藏文件
-l 显示额外的信息
-R 目录递归 每个目录都进去找一遍
-ld 目录和符号链接信息 目录本身的内容
-1 文件分行显示
-S 按从大到小排序
-t 按mtime排序
-u 配合-t选项,显示并按atime从新到旧排序
-U 按目录存放顺序显示
-X 按文件后缀排序
说明:
ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义
2.5 查看文件状态 stat
文件相关信息:metadata, data
ll --time=atime 文件
每个文件有三个时间戳:
- access time 访问时间,atime,读取文件内容
- modify time 修改时间,mtime,改变文件内容(数据) ll看到的内容
- change time 改变时间,ctime,元数据(属性,如所有者)发生改变
[root@centos7-E ~]#stat anaconda-ks.cfg
File: ‘anaconda-ks.cfg’
Size: 1897 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 201326658 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2020-03-14 15:24:12.447998978 +0800
Modify: 2020-03-14 15:22:01.956115831 +0800
Change: 2020-03-14 15:22:01.956115831 +0800
Birth: -
2.6 确定文件内容
file命令检查文件的类型
hexdump -C 查看二进制
dos2unix windows文件转换成Linux文件
iconv -l 显示编码列表
UTF8一统江湖
2.7 文件通配符模式 wildcard pattern
touch 不能识别通配符,逻辑上不能这么干
搜索文件时可以用,实现对现有文件的过滤
* 匹配零个或多个字符 #不匹配.开头的文件,即隐藏文件
? 匹配任何单个字符
~ 当前用户家目录
~mage 用户mage家目录
~+和. 当前工作目录
~- 前一个工作目录
[0-9] 匹配数字范围
[a-z] 字母
[A-Z] 字母
[wang] 匹配列表中的任何的一个字符
[^wang] 匹配列表中的所有字符以外的字符
[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符
ll -d /etc/rc[0-6]*
[root@centos7-E cui]#ls -d .*
. .bash_history .bash_profile .cache .dbus .ICEauthority .mozilla
.. .bash_logout .bashrc .config .esd_auth .local .Xauthority
[root@centos7-E cui]#ls -d /etc/*/ 只列文件夹
2.8 创建空文件和刷新时间 touch
存在的文件就刷新时间,不存在的就创建
2.9 复制文件和目录cp
单纯备份可能会丢失属性
常用选项:
-i 如果目标已存在,覆盖前提示是否覆盖 (普通用户用的是原命令,管理员用的是别名cp=cp -i)
-n 不覆盖,注意两者顺序
-r, -R 递归复制目录及内部的所有内容
-a 归档,相当于-dR --preserv=all,常用于备份功能
-d --no-dereference --preserv=links 不复制原文件,只复制链接名
--preserv[=ATTR_LIST]
mode: 权限
ownership: 属主属组
timestamp:
links
xattr
context
all
-p 等同--preserv=mode,ownership,timestamp
-v --verbose 显示过程
-f --force
-u --update 只复制源比目标更新文件或目标不存在的文件
-b 目标存在,覆盖前先备份,默认形式为 filename~ ,只保留最近的一个备份 ,centos7之前版本
--backup=numbered 目标存在,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留多个版本 #若此选项先执行,后执行-b选项,则按照此选项的格式继续
[root@centos7-E date]#cp -b /etc/passwd f2.txt
[root@centos7-E date]#cp -b /etc/hosts f2.txt
cp: overwrite ‘f2.txt’? y
[root@centos7-E date]#ll
-rw-r--r--. 1 root root 158 Mar 23 20:02 f2.txt
-rw-r--r--. 1 root root 2314 Mar 23 20:02 f2.txt~
[root@centos7-E date]#cp --backup=numbered /etc/issue f1.txt
[root@centos7-E date]#ll
-rw-r--r--. 1 root root 23 Mar 23 19:57 f1.txt
[root@centos7-E date]#cp --backup=numbered /etc/issue f1.txt
cp: overwrite ‘f1.txt’? y
[root@centos7-E date]#ll
-rw-r--r--. 1 root root 23 Mar 23 19:57 f1.txt
-rw-r--r--. 1 root root 23 Mar 23 19:57 f1.txt.~1~
[root@centos7-E date]#cp -r /etc/ /date/etcbackup #目标文件夹本不存在将会被创建
[root@centos7-E date]#ll
total 12
drwxr-xr-x. 144 root root 8192 Mar 23 20:09 etcbackup
[root@centos7-E date]#cp -r /etc/ /date/etcbackup #第二次复制
[root@centos7-E date]#ls etcbackup/ #若目标文件夹已存在,原文件夹将被复制到目标文件夹中成为子目录。再来一次的话将会覆盖。
1、每天将/etc/目录下所有文件,备份到/data独立的子目录下,并要求子目录格式为 backupYYYYmm-dd,备份过程可见
[root@centos8 ~]#cp -av /etc/ /data/backup`date +%F`
2、创建/data/rootdir目录,并复制/root下所有文件到该目录内,要求保留原有权限
[root@centos8 ~]#cp -a /root /data/rootdir
/dev/zero 特殊文件
2.10 移动和重命名文件mv
相当于剪切
同一分区移动数据,速度很快:数据位置没有变化
不同分区移动数据,速度相对慢:数据位置发生了变化
[root@centos7-E date]#ls
etcbackup rootdir
[root@centos7-E date]#mv etcbackup /opt/
[root@centos7-E date]#ls /opt
etcbackup
[root@centos7-E date]#mv rootdir /opt/rootdir.bak
[root@centos7-E date]#ll /opt
drwxr-xr-x. 145 root root 8192 Mar 23 20:10 etcbackup
dr-xr-x---. 7 root root 253 Mar 23 21:25 rootdir.bak
范例:
#为所有的conf文件加上.bak后缀:
rename 'conf' 'conf.bak' f*
#去掉所有的bak后缀:
rename '.bak' '' *.bak
[root@centos7-E date]#ls
file10.conf file2.conf file4.conf file6.conf file8.conf
file1.conf file3.conf file5.conf file7.conf file9.conf
[root@centos7-E date]#rename conf conf.bak *
[root@centos7-E date]#ls
file10.conf.bak file2.conf.bak file4.conf.bak file6.conf.bak file8.conf.bak
file1.conf.bak file3.conf.bak file5.conf.bak file7.conf.bak file9.conf.bak
2.11 删除文件rm
rm -rf .[^.]*
删除隐藏文件
rm -rf * .[^.]*
删除隐藏文件和非隐藏文件
To remove a file whose name starts with a '-', for example '-foo',use one of these commands:
rm -- -foo
rm ./-foo 带路径更具有通用性
范例:删除特殊文件
#将名为 “/data/-f” 的文件删除
[root@centos8 data]#rm -f -f #此方式错误
[root@centos8 data]#rm -- -f
[root@centos8 data]#rm ./-f
[root@centos8 data]#rm /data/-f
[root@centos8 ~]#rm -rf / #直接删根删不了
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
rm -rf /* #删除根下的所有目录,外部命令(在磁盘里)仍可以执行,挂载点的目录文件本身以及内存里的东西删不了
rm虽然删除了文件,但是被删除的文件仍然可能被恢复,在安全要求较高的场景下,可以使用shred安全删除文件
[root@centos8 ~]#shred -zvun 5 passwords.txt
用mv替代rm
[root@centos7-E~]#alias rm='DIR=/date/backup`date +%F%T`;mkdir $DIR;mv -t $DIR'
2.12 目录操作
- 显示目录树 tree
常见选项:
-d: 只显示目录
- 创建目录mkdir
若上级目录不存在,则不能创建,除非加-p
常见选项:
-p: 存在于不报错,且可自动创建所需的各目录
-v: 显示详细信息
-m MODE: 创建目录时直接指定权限
- 删除空目录rmdir
注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树
3 文件元数据和节点表结构
3.1 inode表结构
哪怕资格文件只有一个字节,也会占用4k的块,块是存放数据的最小单位
直接指针只有十二个,能存12*4k的数据
间接块指针,指向指针块,能存4k*1024=4m的数据
- 双重间接块指针,能存4m*1024=4g
- 三重间接块指针,能存4g*1024=4t
每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数据是存放在node(index node)表中。node表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息
第一个node表记录对应的保存了以下信息:
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
注意:文件名是放在目录的内容中的,不放在节点表里,每个分区都有自己的节点编号
1 cp和inode
cp 命令:
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode编号关联
- 拷贝数据生成新的文件
2 rm和inode
rm 命令:
- 链接数递减,从而释放的inode号可以被重用
- 把数据块放在空闲列表中
- 删除目录项
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
3 mv和inode
- 如果mv命令的目标和源在相同的文件系统,作为mv 命令
- 用新的文件名创建对应新的目录项
- 删除旧目录条目对应的旧的文件名
- 同一分区移动,节点编号不变,全国各地搬迁,身份证号不会变,不同分区移动相当于加入外国籍,国内身份将被注销
- 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
- 如果目标和源在一个不同的文件系统, mv相当于cp和rm
[root@centos7-E testdir]touch file{1..52124}
touch: cannot touch ‘file52124.txt’: No space left on device
#事实上空间并没有占满,只是节点编号不够用了
[root@centos7-E testdir]#df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 52428 52428 0 100% /boot
[root@centos7-E testdir]#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 1014M 457M 558M 45% /boot
3.2 硬链接 ln
硬链接本质上就给一个文件起一个新的名称,实质是同一个文件
硬链接特性
- 创建硬链接会增加额外的记录项以引用文件
- 对应于同一文件系统上一个物理文件
- 每个目录引用相同的inode号
- 创建时链接数递增
- 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除 相当于身份被注销
- 不能跨越驱动器或分区
- 不支持对目录创建硬链接
[root@centos7-E date]#ll -i
total 8
71 drwxr-xr-x. 2 root root 20 Mar 24 08:06 dir1
69 -rw-r--r--. 1 root root 595 Mar 24 08:02 f1.txt
[root@centos7-E date]#ln f1.txt dir1/f1.txt
[root@centos7-E date]#ll -i !*
ll -i f1.txt dir1/f1.txt
69 -rw-r--r--. 2 root root 595 Mar 24 08:02 dir1/f1.txt
69 -rw-r--r--. 2 root root 595 Mar 24 08:02 f1.txt #链接数增加一个
3.3 符号 symbolic (或软 soft)链接
一个符号链接指向另一个文件,就像windows中快捷方式,软链接文件和原文件本质上不是同一个文件
软链接特点
- 一个符号链接的内容是它引用文件的名称
- 可以对目录创建软链接
- 可以跨分区的文件实现
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
- 软链接如果使用相对路径,是相对于原文件的路径,而非相对于当前目录
[root@centos7-E date]#ln -s f2.txt f2.txt.link
[root@centos7-E date]#ll -i
70 -rw-r--r--. 1 root root 158 Mar 24 08:02 f2.txt
73 lrwxrwxrwx. 1 root root 6 Mar 24 10:29 f2.txt.link -> f2.txt #成功
[root@centos7-E date]#rm -f f2.txt
[root@centos7-E date]#ll
lrwxrwxrwx. 1 root root 6 Mar 24 10:29 f2.txt.link -> f2.txt #链接被标红,无法使用
[root@centos7-E date]#cp /etc/fstab f1.txt
[root@centos7-E date]#ls
dir1 f1.txt
[root@centos7-E date]#ln -s f1.txt dir1/f1.txt.link #认为两个文件在同一个目录里
[root@centos7-E date]#ll !*
ll -s f1.txt dir1/f1.txt.link
0 lrwxrwxrwx. 1 root root 6 Mar 24 10:51 dir1/f1.txt.link -> f1.txt #失败
4 -rw-r--r--. 1 root root 595 Mar 24 10:50 f1.txt
[root@centos7-E date]#ln -s ../f1.txt dir1/f1.txt.link2 #相对于软连接的工作目录
[root@centos7-E date]#ll dir1/f1.txt.link2
lrwxrwxrwx. 1 root root 9 Mar 24 10:54 dir1/f1.txt.link2 -> ../f1.txt #成功
[root@centos7-E date]#ln -s /date/f1.txt /date/dir1/f1.txt.link3 #全部都写绝对路径
[root@centos7-E date]#ll /date/dir1/f1.txt.link3
lrwxrwxrwx. 1 root root 12 Mar 24 11:09 /date/dir1/f1.txt.link3 -> /date/f1.txt #成功
[root@centos7-E date]#ln -s /date/dir1 /opt/dir1_link #创建文件夹跨分区的软链接
[root@centos7-E date]#ll -d /opt/dir1_link
lrwxrwxrwx. 1 root root 10 Mar 24 11:12 /opt/dir1_link -> /date/dir1
[root@centos7-E date]#cd /usr/local/
[root@centos7-E local]#mkdir mysql5.6.10
[root@centos7-E local]#ll
drwxr-xr-x. 2 root root 6 Mar 24 11:15 mysql5.6.10
[root@centos7-E local]#ln -s mysql5.6.10/ mysql
[root@centos7-E local]#ll
lrwxrwxrwx. 1 root root 12 Mar 24 11:16 mysql -> mysql5.6.10/
drwxr-xr-x. 2 root root 6 Mar 24 11:15 mysql5.6.10
[root@centos7-E local]#mkdir mysql5.6.11
[root@centos7-E local]#ll
lrwxrwxrwx. 1 root root 12 Mar 24 11:16 mysql -> mysql5.6.10/
drwxr-xr-x. 2 root root 6 Mar 24 11:15 mysql5.6.10
drwxr-xr-x. 2 root root 6 Mar 24 11:17 mysql5.6.11
[root@centos7-E local]#rm -f mysql
[root@centos7-E local]#ln -s mysql5.6.11/ mysql
[root@centos7-E local]#ll
lrwxrwxrwx. 1 root root 12 Mar 24 11:18 mysql -> mysql5.6.11/ #偷偷的进行了软件的升级
drwxr-xr-x. 2 root root 6 Mar 24 11:15 mysql5.6.10
drwxr-xr-x. 2 root root 6 Mar 24 11:17 mysql5.6.11
软件回滚upgrade rollback
[root@centos7-E local]#rm -f mysql #把软链接删了
[root@centos7-E local]#ln -s mysql5.6.10/ mysql #给老版本创建软链接
[root@centos7-E local]#ll
lrwxrwxrwx. 1 root root 12 Mar 24 11:21 mysql -> mysql5.6.10/ #轻松搞定
drwxr-xr-x. 2 root root 6 Mar 24 11:15 mysql5.6.10
drwxr-xr-x. 2 root root 6 Mar 24 11:17 mysql5.6.11
执行删除命令 ###很重要!很要命!
[root@centos7-E local]#touch mysql5.6.10/f1.txt
[root@centos7-E local]#touch mysql5.6.11/f2.txt
[root@centos7-E local]#rm -rf mysql #不加斜线
[root@centos7-E local]#ll
drwxr-xr-x. 2 root root 6 Mar 24 11:15 mysql5.6.10
drwxr-xr-x. 2 root root 6 Mar 24 11:17 mysql5.6.11
[root@centos7-E local]#ll mysql5.6.10/
-rw-r--r--. 1 root root 0 Mar 24 11:36 f1.txt #文件存在
[root@centos7-E local]#rm -rf mysql/ #加了斜线
[root@centos7-E local]#ll
lrwxrwxrwx. 1 root root 12 Mar 24 11:21 mysql -> mysql5.6.11/
drwxr-xr-x. 2 root root 6 Mar 24 11:15 mysql5.6.10
drwxr-xr-x. 2 root root 6 Mar 24 11:17 mysql5.6.11
[root@centos7-E local]#ll mysql5.6.11/ #文件被删除
total 0
==总结:敲完命令后不要着急回车,仔细看一看命令==
3.4 硬链接和软链接区别总结
- 本质:
硬链接:本质是同一个文件
软链接:本质不是同一个文件
- 跨设备
硬链接:不支持
软链接:支持
- inode
硬链接:相同
软链接:不同
- 链接数
硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少
软链接:创建或删除,链接数不会变化
- 文件夹
硬链接:不支持
软链接:支持
- 相对路径
硬链接:原始文件相对路径是相对于当前工作目录
软链接:原始文件相对路径是相对于链接文件的相对路径
- 删除源文件
硬链接:只是链接数减一,但链接文件的访问不受影响
软链接:链接文件将无法访问
- 文件类型
硬链接:和源文件相同
软链接:链接文件,和源文件无关