目录
1 文件系统目录结构
1.1 目录结构
- 文件系统从根目录下开始,用“/”表示
- 标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
- 以 . 开头的文件为隐藏文件
- 路径分隔用 /
- 每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容
1.2 常见的文件系统目录功能
- /boot:引导文件存放目录,内核文件、引导加载器都存放于此目录
- /bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
- /sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
- /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
- /lib64:专用于x86_64系统上的辅助共享库文件存放位置
- /etc:配置文件目录
- /home/USERNAME:普通用户家目录 /root:管理员的家目录
- /media:便携式移动设备挂载点
- /mnt:临时文件系统挂载点
- /dev:设备文件及特殊文件存储位置
- /opt:第三方应用程序的安装位置
- /srv:系统上运行的服务用到的数据
- /tmp:临时文件存储位置
- /proc: 用于输出内核与进程信息相关的虚拟文件系统
- /sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
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/do
1.4 Linux下的文件类型
- - 普通文件
- d 目录文件directory
- b 块设备block
- c 字符设备character
- l 符号链接文件link
- p 管道文件pipe
- s 套接字文件socket
2 文件操作命令
2.1 显示当前的工作目录
pwd命令:
- -P 显示真实物理路径
- -L 显示链接路径(默认)
2.2 相对路径和绝对路径
绝对路径:
- 以正斜杠/ 即根目录开始
- 完整的文件的位置路径
- 可用于任何想指定一个文件名的时候
相对路径:
- 不以斜线开始
- 一般情况下,是指相对于当前工作目录的路径
- 特殊场景下,是相对于某目录的位置
- 可以作为一个简短的形式指定一个文件名
相关命令:
- 基名:basename,只取文件名而不要路径
- 目录名:dirname,只取路径,不要文件名
2.3 更改目录
cd命令:
- 切换至上级目录:cd ..
- 切换至家目录:cd
- 切换至上一个工作目录:cd -
相关环境变量:
- PWD 当前目录路径
- OLDPWD 上一次工作目录路径
2.4 列出目录内容
ls 命令可以列出当前目录或指定目录的内容
- -a 包含隐藏文件
- -l 显示详细的信息
- -R 目录递归
- -ld 目录和符号链接信息
- -1 文件分行显示
- -S 按从大到小排序
- -t 按mtime排序
- -u 配合-t选项,显示并按atime从新到旧排序
- -U 按目录存放顺序显示
- -X 按文件后缀排序
说明:
- ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义
2.5 查看文件状态
每个文件有三个时间戳:
- access time 访问时间,atime,读取文件内容
- modify time 修改时间,mtime,改变文件内容(数据)
- change time 改变时间,ctime,元数据发生改变
2.6 确定文件内容
文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用。
选项:
- -b 列出文件辨识结果时,不显示文件名称
- -f filelist 列出文件filelist中文件名的文件类型
- -F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
- -L 查看对应软链接对应文件的文件类型
- --help 显示命令在线帮助
相关命令:
- hexdump:以多少进制方式显示文件内容,-C选项输出规范的十六进制和ASCII码。
- dos2unix:将windows文本文件格式转换成Linux文本格式文件
- iconv:转换文件的编码方式
范例1:Linux文本格式与windows文本格式的区别
范例2:转换文件字符集编码
iconv -f gb2312 win.txt -o win1.txt
选项说明:
- -f 指定字符的编码方式
- -o 指定输出文件
范例3:将windows文本格式文件与Linux文本格式文件相互转换
2.7 文件通配符
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
常见的通配符如下:
- * 匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
- ? 匹配任何单个字符
- ~ 当前用户家目录
- ~mage 用户mage家目录
- ~+和. 当前工作目录
- ~- 前一个工作目录
- [0-9] 匹配数字范围
- [a-z] 字母
- [A-Z] 字母
- [wang] 匹配列表中的任何的一个字符
- [^wang] 匹配列表中的所有字符以外的字符
此外还有在Linux系统中预定义的字符类:
- [:digit:]:任意数字,相当于0-9
- [:lower:]:任意小写字母,表示 a-z
- [:upper:]: 任意大写字母,表示 A-Z
- [:alpha:]: 任意大小写字母
- [:alnum:]:任意数字或字母
- [:blank:]:水平空白字符
- [:space:]:水平或垂直空白字符
- [:punct:]:标点符号
- [:print:]:可打印字符
- [:cntrl:]:控制(非打印)字符
- [:graph:]:图形字符 [:xdigit:]:十六进制字符
范例:
- 显示/etc目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
- 显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录
- 显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录
- 显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符的文件或目录
- 显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录
- 只显示/root下的隐藏文件和目录列表 7、只显示/etc下的非隐藏目录
2.8 创建空文件或刷新文件时间
touch命令可以用来创建空文件或刷新文件的时间
- -a 仅改变 atime和ctime
- -m 仅改变 mtime和ctime
- -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
- -c 如果文件不存在,则不予创
2.9 复制文件或目录
利用 cp(copy)命令可以实现文件或目录的复制
格式:
- cp [OPTION]... [-T] SOURCE DEST
- cp [OPTION]... SOURCE... DIRECTORY
- cp [OPTION]... -t DIRECTORY SOURCE...
常用选项:
- -i 如果目标已存在,覆盖前提示是否覆盖
- -n 不覆盖,注意两者顺序
- -r, -R 递归复制目录及内部的所有内容
- -a 归档,相当于-dR --preserv=all,常用于备份功能
- -b 目标存在,覆盖前先备份,默认形式为 filename~ ,只保留最近的一个备份
- --backup=numbered 目标存在,覆盖前先备份加数字后缀,形式为 filename.~#~ ,可以保留多个版本
范例1:每天将/etc/目录下所有文件,备份到/data独立的子目录下,并要求子目录格式为 backupYYYY mm-dd,备份过程可见。
cp -av /etc/ /data/backup`date +%F`
范例2:创建/data/rootdir目录,并复制/root下所有文件到该目录内,要求保留原有权限
mkdir /data/rootdir
cp -a /root /data/rootdir
2.10 移动和重命名文件
mv 命令可以实现文件或目录的移动和改名
2.11 删除文件
使用 rm 命令可以删除文件
- -i 交互式
- -f 强制删除
- -r 递归
- --no-preserve-root 删除/,注意该选项极度危险
2.12 目录操作
显示目录树:tree
- -d: 只显示目录
- -L level:指定显示的层级数目
- -P pattern: 只显示由指定wild-card pattern匹配到的路径
创建目录:mkdir
- -p: 存在于不报错,且可自动创建所需的各目录
- -v: 显示详细信息
- -m MODE: 创建目录时直接指定权限
删除空目录:rmdir
-
-p 递归删除父空目录
-
-v 显示详细信息
3 文件元数据和节点表结构
3.1 inode表
每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数 据是存放在node(index node)表中。
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系:
- 文件引用的是一个 inode号
- 人是通过文件名来引用一个文件
- 一个目录是目录下的文件名和文件inode号之间的映射
3.2 硬链接
硬链接本质上就给一个文件起一个新的名称,实质是同一个文件
硬链接特性:
- 创建硬链接会在对应的目录中增加额外的记录项以引用文件
- 对应于同一文件系统上一个物理文件
- 每个目录引用相同的inode号
- 创建时链接数递增
- 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
- 不能跨越驱动器或分区
- 不支持对目录创建硬链接
创建硬链接:
- ln filename [linkname]
3.3 软链接
一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件。
软链接特性:
- 一个符号链接的内容是它引用文件的名称
- 可以对目录创建软链接
- 可以跨分区的文件实现
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
- 软链接如果使用相对路径,是相对于原文件的路径,而非相对于当前目录
创建软链接:
- ln -s filename [linkname]
说明:软链接以相对路径方式创建时,相对的是被链接的文件路径
范例:
3.4 软硬连接的区别
1. 本质:
- 硬链接:本质是同一个文件
- 软链接:本质不是同一个文件
2. 跨设备
- 硬链接:不支持
- 软链接:支持
3. inode
- 硬链接:相同
- 软链接:不同
4. 链接数
- 硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少
- 软链接:创建或删除,链接数不会变化
5. 文件夹
- 硬链接:不支持
- 软链接:支持
6. 相对路径
- 硬链接:原始文件相对路径是相对于当前工作目录
- 软链接:原始文件的相对路径是相对于链接文件的相对路径
7. 删除源文件
- 硬链接:只是链接数减一,但链接文件的访问不受影响
- 软链接:链接文件将无法访问
8. 文件类型
- 硬链接:和源文件相同
- 软链接:链接文件,和源文件无关
3.5 故障案例分析
案例1:创建文件提示空间满 No space left on device,但 df 可以看到空间很多,为什么?
- 问题原因:每创建一个文件都会用掉该分区的一个inode编号,编号用完就会报该错误。
- 解决办法:删除无用文件。
案例2:使用df发现空间快满,使用rm 删除了很大的无用文件后,但df仍然看到空间不足?
- 问题原因:当有其它用户在对改文件进行操作(如vim)时,可能会导致该情况
- 解决办法:使用lsof |grep delete找到删除该文件的进程,再使用kill -f 杀掉该进程
- 未来正确删除方法:cat /dev/null > bigfile