文件查找和解压缩
在文件系统上查找符合条件的文件,文件查找的工具有两个,locate 和 find
文件查找分为:
locate 非实时查找 (在数据库查找)
updatedb 更新数据库
经常用于搜索稳定的文件,比如配置文件
var/lib/mlocate/mlocate.db 数据库路径
find 实时查找
locate :
查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db
依赖于实现构建的索引;索引的构建实在系统较为空闲时自动进行(周期性任务)
管理员可以手动更新数据库 updatedb
索引构建过程需要遍历整个根文件系统,及其消耗资源
工作特点:查找速度快
模糊查找
非实时精准查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录
locate 选项 关键字
locate -i AAA 执行时不区分大小写的搜索
locate -n 2 aa 只列出前几个的匹配项目
locate makangbo 搜索名称或路径中带有makangbo的文件
locate -r ‘\.bash$’ 使用正则表达式来搜索以 bash结尾的文件
find 实时查找工具,通过遍历指定路径完成文件查找;
特点:精确查找、精准查找、速度慢 、可能只搜索用户具备读取和执行权限的目录
语法:find [选项] [查找路径] [查找条件] [处理动作]
查找路径:指定具体目路径;默认为当前目录
查找条件:指定的查找标准,可以文件名,大小,类型,权限等标准进行;默认为指定路径下的所有文件
处理动作: 对符合条件做操作,默认输出至屏幕
查找条件:
根据文件名和inode查找
-name "file" 支持使用正则表达式 ]# find -name makangbo 搜索名为makangbo 的文件
* ? [] [^] ~]# find / -name "*.txt" 搜索根目录以 *.txt为结尾前面是任意字符的文件
-iname "file" 不区分字母的大小写 ]# find -iname MAkangbo 不去分大小写的搜索名为makango 或者MAkangbo 等文件
-inum inode 按照inode号查找 ]# find -inum 5555 节点号文件搜索
-samefile filename 相同inode号的文件
-links 链接数 链接数为多少的文件 ]# find -in -links 5 链接数为6的文件
-regex "表达式" 以表达式匹配整个文件路径字符串,而不仅仅是文件名称
-user 用户名 根据文件的属主查找
-group 组名 根据文件的属组查找
-uid UID 根据UID查找文件
-gid GID 根据GID查找文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
根据文件类型查找:
-]# find -user makangbo -type f 例如查找用户之下的普通文件
f 普通文件
d 目录文件
l 符号链接文件
s 套接字文件
b 块设备文件
c 字符设备文件
p 管道文件
组合条件查找:
-a 与
-o 或
-not ,! 非
-not A-a -not B = -not(A -o B) 不是A 也不是B
-not A-o -not B = -not(A -a B) 不是A或者不是B
!A -a !B=!(A -o B) 不是A 也不是 B
!A -O !B=!(A -a B) 不是A 或者不是B
注意:括号需要转义\(\)
德摩根定律:
非P 或 非Q = 非(P 且 Q) 前面两个第一个不是P 或者不是Q,那就是不是的意思,同等与不是(P与Q)
非P 且 非Q = 非(P 或 Q) 前面两个第一个不是P 并且不是Q ,那就是,两个都是非的意思,同等与 不是(P或者Q)
~]# find /var -name "*log*" 搜索/var目录下以 log为关键字的搜索文件前后匹配任意字符
~]# find -user makangbo -group makangbo 搜索 用户makangbo 以及组群makangbo 所拥有的文件
]# find -user makangbo -not -group makangbo 搜索用户makangbo 组不是makangbo的文件
]# find -user makangbo -o -user root 搜索用户makangbo 或者 用户root 的文件 满足一个条件即可
]# find -not \( -user makangbo -o -user root \) 搜索不是 和用户makangbo 或者 用户root 的文件
]# find / -user makangbo -o -uid 500 搜索根目录下 用户makangbo 或者 uid 500 的文件
]# find /tmp \( -not -user root -a -not -name "f*" \) 找出/tmp目录下,用户属主不是root,且 文件名不是以f开头的文件
]# find /tmp -not \( -user root -o -name "f*" \) 不是用户root 或 不以f开头的文件
根据文件大小查找:
~]# find -size +10k
常用单位:k,m,g
find -size 10k 表示9k到10k之间 (9k,10k)在原有的数字上面-1
find -size +10k 表示10k以上不包括10 无限大(10k,∞)
find -size -10k 表示0k到9k 包括9k(0,9k)
根据时间戳:
以天为单位
~]# find -atime 5
find -atime 5 表示最近5天到6天 (5,6)在原有的数字上面+1
find -atime +5 表示5天以上,至无限大 (5,∞)
find -atime -5 表示0天到5天 (0-5)
-mtime
-ctime
以分钟为单位
-amin
-mmin
-cmin
根据权查找:
-perm [/|-] 模式 精确的权限匹配
~]# find -perm 644
任何一类用户的权限只要能包含对其指定的任何一位权限即可,或关系,+从7版本跟换为/ 表示或者 - 表示并且
find -perm 755 会匹配权相模式正好是755的文件
find -perm +222 匹配只要当任意用户都有写权限时
find -perm -222 表示每一位中的权限小于等于2就匹配
find -perm -002 只有当其他人(other)有写权限时,才会匹配
find -perm -666 包括666 650 550 111 等,但不包括766 等
find -perm +621 表示属主有读或者写,或者属组有写,或者其他有执行权限的都可以
-002 中的0表示不匹配属主和属组的权限,而不是说属主和属组没有任何的权限 0表示不关注
处理动作:
例如 find -perm 222 -print
跟搜索条件的后缀
-print 默认的处理动作,显示,打印到屏幕 ~]# find f1 -print -ls 默认输出打印显示,不加也一样
-ls 类似于对查找到的文件执行 ls -l 命令 ~]# find f1 -ls
-delete 删除查找到的文件 ~]# find f1 -delete 对查找到的文件直接删除,不提示,擅用此命令
-fls /路径文件/查找到的所有文件的长格式信息保存至指定文件中 ~]# find f1 -fls /root/f1.log 这时会生成一个f1.log的文件 ,就是查到的命令导入一个指定文件内 ;同等与重定向文件
-ok 命令 {}\; 对查找的每个文件执行由指定命令的命令
对于每个文件执行命令之前都会交互式的要求用户确认
其中{}表示前面查找到的所有内容引用 ~]# find f1 -ok rm {} \; 是否删除引用前面的搜索内容
-exec 命令 {}\; 对查找到的每个文件执行由命令指定的命令 ,不提示用户执行 ~]# find f1 -exec rm {} \; 直接执行 ,不提示
find 传递查找到的文件至后面指定的命令时,查找到所有的符合条件的文件一次性传递给后面的命令
有些名看客不能接受过多参数,此时命令执行可能会失败,
可以用这条命令规避此问题 : find | xargs 命令
~]# find -name "*.sh" -exec cp {} {}.bak \;
将搜索.sh为结尾的文件进行备份,添加.bak 扩展名
~]# find /tmp -ctime +3 -user makangbo -ok rm {} \;
提示删除存在时间超过3天以上的用户makangbo的临时文件
~]# find -perm -002 -exec chmod o-w {} \;
在家目录中寻找可以被其他用户写入的文件
~]# find /home/ -type d -ls
搜索home下的 目录文件
练习
1、查找/var目录下属主为root,且属组为mail的所有文件
~]# find /var -user root -a -group mail
2、查找/var目录下不属于root、lp、gdm的所有文件
~]# find /var -not -user root -a -not -user lp -a -not -user gdm
~]# find /var -not \( -user root -o -user lp -o -user gdm \)
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是xiaomag的文件
~]# find /var -mtime -7 -a -not -user root -a -user xiaomag
~]# find /var -mtime -7 -not \( -user root -o -user xiaomag\)
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
~]# find / -atime -30 \( -nouser -o -nogroup \)
5、查找/etc目录下大于1M且类型为普通文件的所有文件
~]# find /etc -size +1M -type f
查找路径, 根据大小查找大于1M,查找普通文件
6、查找/etc目录下所有用户都没有写权限的文件
~]# find /etc -not -perm +222 -ls
7、查找/etc目录下至少有一类用户没有执行权限的文件
~]# find /etc -not -perm -222 -ls
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
~]# find /etc/init.d/ -perm -113
解压缩 和归档工具
早期有compress 和 uncompress ,对应的是.Z结尾的压缩格式文件,
gzip 和 gunzip 对应的是.gz 结尾的压缩格式文件
bizp2 和 bunzai2 对应的是.bz结尾的压缩格式文件
xz 和 nuxz 对应的是.xz结尾的压缩格式文件
zip 和 unzip 对应的.zip结尾的压缩格式文件
tar 归档
cpio 打包
compress 和 uncompress
语法 compress 选项 文件
compress file 压缩文件 不保留原始的文件
compress -d file 解压缩,同等于uncompress
compress -c file 将压缩或解压缩的结果输出值标准输出,保留原始文件 ~]# compress -c file > file.Z
compress -v file 显示详情
zcat file.Z >file 解压缩 后缀是Z
gzip 和 gunzip
语法 gzip 选项 文件
gzip -# file #为数字 指明压缩比;1-9,默认为6,数字越大,压缩比越大 例如最大压缩比:gzip -9 file
gzip -d file.gz 解压缩文件 ,同等与解压缩的命令gunzip
gzip -c file 将压缩或解压缩的结果输出值标准输出,保留原始文件
例如 gzip -c file > file.gz 重定向到文件,保留了原来的文件
gizp -r file 递归至目录中对每个文件进行压缩
zcat file.gz >file 无须显示解压缩查看压缩文件的内容 > 可以重定向文件
例如 gzip -c -d file.gz > /目标路径/file 压缩文件后缀是gz
bzip2 和 bunzip2 /bzcat
语法 bzip2 选项 文件
bizp2 -# file #为数字 指明压缩比;1-9,默认为6,数字越大,压缩比越大 例如最大压缩比:bzip2 -9 file
bzip2 -k file 压缩后保留原文件
bzip2 -d file 解压缩,同等于 bunzip2 压缩文件后缀是bz2
bzcat /目标路径/file.bz2 无须显示解压缩查看压缩文件的内容 > 可以重定向文件
xz /unxz /xzcat
语法 xz 选项 文件
xz -# file #为数字 指明压缩比;1-9,默认为6,数字越大,压缩比越大 例如最大压缩比:bzip2 -9 file
xz -k file 压缩后保留原文件
xz -d file 解压缩,同等于 bunzip2 压缩文件后缀是xz
xzcat /目标路径/file.xz 无须显示解压缩查看压缩文件的内容 > 可以重定向文件
zip / unzip
打包压缩
zip -r file路径 源路径
命令选项 生成路径 源文件路径 可以多个文件压缩归档成单个文件 压缩文件后缀是zip
解包解压缩
unzip file
性能排行:xz ;bzip ; gzip 从高到底,但是经常用的是gzip
归档工具
归档就是将多个文件打包为单个文件以便于管理,默认的归档不会执行压缩
常用的工具有 tar ; cpio
语法 tar 选项 file
创建归档tar
tar -c -f /PATH/TO/SOMEFILE.tar FILE
tar cf /PATH/TO/SOMEFILE.tar FILE
~]# tar -c -f /root/f2.tar f2 归档文件f2到f2.tar中
注意:归档不会删除原文件
查看归档文件中的文件列表
~]# tar -t -f /root/f2.tar 查看f2.tar中的文件列表
展开归档
~]# tar -x -f /root/f2.tar
~]# tar -x -f /root/f2.tar -C /PATH/
结合压缩工具实现:归档并压缩
-z gzip
后缀名:.tar.gz
归档并压缩:tar-zcf ~]# tar -zcf /root/f3.tar.gz f3
展开归档:tar -zxf ~]# tar -zxf f3.tar.gz
-j bzip2
后缀名:.tar.bz2
归档并压缩:tar -jcf ~]# tar -jcf /root/f3.tar.bz2 f3
展开归档:tar -jxf ~]# tar -jxf f3.tar.bz2
-J xz
后缀名:.tar.xz
归档并压缩:tar -Jcf ~]# tar -Jcf /root/f3.tar.xz f3
展开归档:tar -Jxf ~]# tar -Jxf f3.tar.xz
注意:展开归档可以直接使用tar -xf 而无视指定对应的压缩工具选项
cpio 归档文件及从包中提取文件
cpio 命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,他可以解压以.cpio 或者 .tar 结尾的文件
cpio 选项 > 文件名或者设备名
cpio 选项 < 文件名或者设备名
cpio -o 将文件拷贝打包成文件或者将文件输出到设备上
cpio -i 解包,将打包文件解压或将设备上的备份还原到系统
cpio -t 预览,查看文件内容或者输出到设备上的文件内容
cpio -v 显示打包过程中的文件名称
cpio -d 解包生成目录,在cpio还原时,自动建立的目录
cpio -c 一种比较新的存储方式
举例
将etc 目录备份
~]# find /etc -print | cpio -ov >etc.cpio
搜索etc目录下的文件打印输出到设备 将文件拷贝打包过程中将文件输出到设备 显示文件名称 重定向名称
内容预览
~]# cpio -tv <etc.cpio
预览输出设备 显示过程中的文件名称
解包文件
~]# cpio -iv <etc.cpio
~]# cpio -idv <etc.cpio