文件管理
文件系统和目录结构
文件和目录被组成成一个单根倒置树结构。根文件系统rootfs root filesystem
rootfs:/etc/,/usr,/var,/root,/home,/dev
文件系统分层结构 LSB Linux Standard Base
FHS:Filesystem Hierarchy Standard 文件系统层级标准
/bin:基本命令
/sbin:管理类命令
/lib /lib64:库文件
/etc:配置文件
/dev:设备文件及特殊文件
/root:root用户家目录
/usr:universal shared, read-only data
/srv:服务相关文件
/var:可变数据
/tmp:临时文件
/home:家目录
/opt:第三方程序
/sys:硬件相关
/proc:虚拟文件系统
/media:便携式移动设备挂载点
/mnt:临时挂载点
/misc:杂项,自动挂载
文件名命令规则
最长不超过255字符,以.开头的为隐藏文件;标准Linux文件系统,文件名称大小写敏感
显示颜色
灰色 普通文件
蓝色 目录
绿色 二进制可执行程序
红色 打包文件
浅蓝色 链接文件
路径 目录:路径映射
相对路径 从当前位置开始
绝对路径 以/开头 从根开始
basename 取基名
dirname 取目录名
文件类型
-:普通文件
d:目录
b:块设备
l:符号链接文件
s:套接字文件socket
p:管道文件pipe
文件相关命令
pwd
cd 切换目录
ls
-a:显示隐藏文件
-d:显示目录本身
-l:列表
-h:显示单位
mv
cp
rm
touch新建文件和修改时间戳
Linux时间戳
Access 访问时间atime
Modify 修改时间mtime
Change 改变时间ctime
目录相关
mkdir
rmdir
tree
索引节点Inode(index node)
Linux文件在磁盘上存放成两部分
元数据metadata
数据data
元数据和数据本身在硬盘上保存时是分离的
当访问文件时先访问此文件的元数据,元数据中有指针指向数据
元数据中还有Inode(节点编号)
节点编号用来标识文件的唯一性(在一个分区中唯一) 系统自动分配,有最大值
查看文件节点编号:df -i
存放文件元数据空间:节点表
结构
权限 所有者 大小 时间戳 指针
指针
直接指针:指向数据块 12个(12X4k 最大找48k文件)
Linux系统分配文件最小单位:块(大小4k)
间接指针:指向指针块
链接
硬链接 一个文件多个名字,没有依赖性
语法 ln filename [filename]
软件链接 一个文件对应的快捷方式,多个文件
一般使用相对路径,相对路径是相对于软链接的路径
语法 ln -s filename [filename]
区别
1.大小
软:原始文件路径决定
2.链接数
硬:初始为2,创建时链接数递增(为0时文件被删除)
软:始终为1
3.跨分区
硬:不可跨分区创建
软:可以跨分区创建
4.目录
硬:不可创建
软:可以创建
5.原始和链接文件关系
硬:平等关系
软:依赖原始文件
6.删除
硬:不受影响
软:删除原始文件链接失效
标准I/O 重定向
标准输入和输出
程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd filedescriptor(文件描述符)
Linux给程序提供三种标准I/O设备
I/O重定向改变默认位置
语法
命令 操作符 文件名
标准输入(STDIN) 0 默认接受来自键盘输入
重定向到文件 <
标准输出(STDOUT) 1 默认输出到终端窗口
重定向到文件 >覆盖 >>追加
错误输出(STDERR) 2 默认输出到终端窗口
重定向到文件 2>覆盖 >>追加
合并标准输出和错误输出为同一个数据流进行重定向
&> 覆盖 &>>追加
command /path/to/somefile.out 2&>1 (顺序很重要) 覆盖
command /path/to/somefile.out 2&>>1 追加
/dev/null 数据黑洞
单行重定向
每一个分别重定向一次,按一次回车重定向一次
多行重定向(heretext就地文本)
把多行内容一次发送给标准输出进行重定向
<<终止符开始 终止符结束(开始和结束的终止符必须相同且必须是独立一行)
tr 转换或删除字符
tr [OPTION]... SET1 [SET2]
-c:取字符的补集
-d:删除第一字符集字符
-s:把连续重复的字符压缩成一个字符
-t:把第一字符集对应转化为第二字符集
管道
command1 | command2 | command3...
command1的标准输出作为command2的标准输入
重定向到多个目标(tee)
command1 | tee [-a ] filename | command2
把cmd1的STDOUT保存在文件中,做为cmd2的输入 -a 追加
文件查找及压缩
文件查找工具
locate 非实时查找(数据库查找)
工作机制:依赖于事先构建的索引数据库来查找,索引构建过程需要遍历整个根文件系统,极消耗资源。此命令一般用于查找变化不频繁的文件。
查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db
索引构建是在系统较为空闲时自动进行(周期性任务),一般是开机时进行构建。
管理员也可手动更新数据库:updatedb
工作特点:
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
语法:
locate [OPTION]... PATTERN...
-i:不区分大小写的搜索
-n N:只列举前N个匹配项目
-r:支持使用扩展正则表达式
find 实时查找
工作机制:实时查找工具,通过遍历指定路径完成文件查找,默认递归搜索
工作特点:
查找速度慢
精确查找
实时查找
可能只搜索用户具备读取和执行权限的目录
语法:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径 指定具体目标路径,默认为当前目录
查找条件 指定查找标准,如文件大小,类型,权限等;默认查找指定路径下的所有文件
搜索层级
-maxdepth #:最大搜索目录深度,指定目录为#级
-mindepth #:最小搜索目录深度
文件名及inode
-name“文件名称”:支持使用glob
*,?,[ ],[ ^]
-iname “文件名称”:不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件(硬链接文件)
-links n 链接数为n的文件
-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称。
属主、属组
-user USERNAME:查找属主为指定用户(UID)的文件
-group GROUPNAME:查找属组为指定组(GID)的文件
-user UID:查找属主为指定UID号的文件
-group GID:查找属组为指定GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
文件类型
-type TYPE:
f:普通文件
d:目录
b:块设备文件
c:字符设备文件
s:套接字文件
l:链接文件
p:管道文件
-empty 空文件或目录
find /data -type d -empty
find /data -type f -empty
排除目录
-prune
文件大小
-size [+|-]#UNIT
常用单位:k,M,G,c(byte)
#UNIT:(#-1,#]
如:6k (5k,6k] 大于5k小于等于6k
-#UNIT:[0,#-1]
如:-6k [0,5k] 大于等于0小于等于5k
+#UNIT:(#,∞)
如:+6k (6k,∞) 大于6k的所有
时间戳
以“天”为单位
-atime [+|-]#
#:[#,#+1)
3 [3,4) 3天之外(包括3天)4天之内
+#:(#+1,∞]
+3 (4,∞] 4天之外
-#:[0,#)
-3 [0,3) 3天之内不包括3天
-mtime
-ctime
以“分钟”为单位
权限
-perm[+|-]MODE
MODE:精确匹配
/MODE:或关系,三类中(u,g,o)有一个满足条件即可 + 从Centos7开始淘汰
-MODE:与关系,每一类对象都同时拥有指定权限
1表示关注 0表示不关注
例:
find -perm 755 匹配权限恰好是755的文件
find -perm /644 匹配当u有6权限或g有4权限或o有4权限的文件
find -perm -741 匹配u有7权限并且g有4权限并且o有1权限的文件
条件组合
与:-a
或:-o
非:-not,!
德摩根定律
not a or not b=not(a and b)
not a and not b=not(a or b)
例
!A or !B=!(A and B)
!A and !B=not(A or B)
处理动作 对符合条件的文件做操作,默认为输出至屏幕
-print:默认处理动作,显示至屏幕
-ls:显示查找到的文件的详细信息
-delete:删除查找到的文件
-fls file:查找到的文件的长格式信息保存至指定文件中
-ok COMMAND:对查找到的文件执行由COMMAND指定的命令,对于每个文件执行命令之前,会交互式要求用户确认。
-exec COMMAND {}\;:对查找到的每个文件执行由COMMAND指定的命令
{}:用于引用查找到的文件名称自身
find:传递查找到的文件至后面指定命令时,查找到所有符合条件的文件一次性传递给后面的命令
参数替换xargs
把读入的数据分割成多个命令,用来解决参数过多导致无法执行的命令
find和xargs格式:find|xargs COMMAND
例: echo f{1..1000000}|xargs touch
压缩、解压缩及归档工具
Linux中的压缩解及归档工具 常见的压缩格式后缀有:.Z .gz .bz2 .xz
compress/uncompress/zcat
compress [-dfvcVr] [-b maxbits] [file ...]
-d:解压缩
-c file:结果输出至屏幕,不删除原文件
-v:显示详情
uncompress 解压缩
zcat file.Z > file 解压缩并且保留原文件
gzip/gunzip/zcat
gzip [OPTION]... [FILE]...
-d:解压缩
-c:将压缩或解压缩的文件输出至标准输出
-#:1-9指定压缩比,值越大压缩比越大
gunzip:解压
zcat:不解压的前提下查看文本文件
file.gz > file 解压并保存原文件
bzip2/bunzip2/bzcat
bzip2 [OPTION]... [FILE]...
-k:keep,保留原文件
-d:解压
-#:1-9,压缩比,默认为9
bzcat:不显式解压缩的前提下查看文本文件内容
xz/unxz/xzcat
xz [option...] [file...]
-d:解压
-k:keep,保留原文件
-#:1-9,压缩比,默认为6
unxz:解压
xzcat:不显式解压的前提下查看文本文件内容
zip/unzip
zip file.zip file 压缩文件
打包压缩
zip -r /testdir/sysconfig /etc/sysconfig/ 压缩目录
把/etc/sysconfig/目录压缩到/testdir/sysconfig这个文件中
解包解压
unzip sysconfig.zip
cat /var/log/messages | zip messages -
unzip -p message > message
压缩比排序:xz > bz2 > gz > zip > Z
Linux中使用较多的压缩工具:xz,bz2,gz
归档工具
tar工具 tar(Tape ARchive,磁带归档缩写)
tar [OPTION...] [FILE]...
-c:打包,创建打包文件
-f FILE:打包的文件名
-v:显示过程
-p:保留原有属性
(1)创建归档
tar -cpvf /PATH/TO/SOMEFILE.tar FILE...
(2)追加文件至归档
tar -rvf /PATH/TO/SOMEFILE.tar FILE...
(3)预览归档文件中的文件列表
tar -tvf /PATH/TO/SOMEFILE.tar
(4)展开归档
tar -xvf /PATH/TO/SOMEFILE.tar 解压到当前目录下
tar -xvf /PATH/TO/SOMEFILE.tar -C /PATH/ 解压到指定路径下
(5)结合压缩工具实现:归档并压缩
-z:gzip,打包成.gz或.tgz后缀的
-j:bzip2,打包并压缩成.bz2后缀的
-J:xz,打包并压缩成.xz后缀
-T指定输入文件,-X指定包含要排除的文件列表
tar zcpvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
分割大的tar大文件为多个小文件
split -b -size -d tar-file-name prefix-name
合并
cat mybackup-parts* > mybackup.tar.gz
cpio 通过重定向方式将文件进行打包备份或还原恢复工具,解压以“.cpio”或者“.tar”结尾的文件
cpio [选项名] > 文件名或设备名
cpio [选项名] < 文件名或设备名
-o:将文件复制打包成文件或者将文件输出到设备上
-i:解包,将打包文件解压或将设备上备份还原到系统
-t:预览,查看文件内容或输出到设备上的文件内容
-v:显示打包过程中的文件名称
-d:解包生成目录,在cpio还原时,自动建立的目录
-c:一种较新的存储方式
备份
find ./etc -print | cpio -ov > etc.cpio
内容预览
cpio -tv < etc.cpio
解包文件
cpio -idv < etc.cpio