1、 locate命令(非实时查找即数据库查找)
1)、查询系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db
依赖于事先构建的索引;索引的构建是在系统较为空闲时自动进行( 周期性任务) 或者管理员手动更新数据库即是执行#updatedb命令;引构建过程需要遍历整个根文件系统,极消耗资源;
工作特点:查找速度快、模糊查找、非实时查找、搜索的是文件的全路径-不仅仅是文件名、可能只搜索用户具备读取和执行权限的目录
2)、locate KEYWORD
有用的选项
• -i 执行不区分大小写的搜索
• -n X 只列举前X 个匹配项目
#locate foo
• 搜索名称或路径中带有“foo ”的文件
#locate -r ‘\.foo$’
• 使用Regex来搜索以“.foo”结尾的文件
2、find命令(实时查找,通过遍历指定路径完成文件查找)
1)、工作特点:查找速度略慢、精确查找、实时查找、可能只搜索用户具备读取和执行权限的目录
2)、find [OPTION]… [ 查找路径] [ 查找条件] [ 处理动作]
(查找的是符合指定条件的查找路径各目录层级下的文件)
查找路径:指定具体目标路径,也即是查找范围,默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行,默认为找出指定路径下的所有文件
处理动作:对符合条件的文件作出操作,默认输出至屏幕
3)、查找条件
①、根据文件名和inode(#ll -i命令可以查看文件的inode) 查找:
-name " 文件名称" :支持使用glob通配符*, ?, [], [^]等等
例如#find / -name *checkint*
-iname " 文件名称" :不区分字母大小写
-inum n :按inode号查找
-samefile name :相同inode号的文件
-links n :链接数为n的文件
-regex "PATTERN" :以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
例如#find /root/bin –regex “.*\.sh$”
②、根据属主、属组查找:
-user USERNAME :查找属主为指定用户(UID)的文件
-group GRPNAME : 查找属组为指定组(GID)的文件
-uid UserID :查找属主为指定的UID号的文件
-gid GroupID :查找属组为指定的GID号的文件
-nouser :查找没有属主的文件
-nogroup :查找没有属组的文件
③、根据文件类型查找:
-type TYPE
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
④、根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G
#UNIT: (#-1, #] ,如:6k
-#UNIT :[0,#-1], 如:-6k
+#UNIT :(#, ∞ ), 如:+6k
⑤、根据时间戳:
以“天”为单位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1, ∞ ]
-#: [0,#)
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
⑥、根据权限查找:
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o) 对象权限中只要能一位匹配即可,或关系,以前使用的+从centos7开始淘汰
-MODE :每一类对象都必须同时拥有指定权限,与关系
0表示不关注
• find -perm 755 会匹配权限模式恰好是755 的文件
• 只要当任意人有写权限时,find -perm /222 就会匹配
• 只有当每个人都有写权限时,find -perm -222 才会匹配
• 只有当其它人(other )有写权限时,find -perm -002才会匹配,不关注属主和属组是否具有写权限
4)、组合条件
与:-a
或:-o
非:-not, !
德·摩根 定律:
非(P 且 Q) = (非 P) 或 (非 Q)
非(P 或 Q) = (非 P) 且 (非 Q)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
示例:
找出/tmp 目录下,属主不是root ,且文件名不是fstab 的文件
#find /tmp \( -not -user root -a -not -name 'fstab' \) -ls
#find /tmp -not \( -user root -o -name 'fstab' \) –ls
小括号要进行转义
排除目录(查找路径/etc,如果是/etc/sane.d目录下的全部剪除,否则查找查找 .conf结尾的文件)
# find /etc -path "/etc/sane.d" -a -prune -o -name "*.conf" -print
5)、处理动作
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ls -l” 命令
-delete:删除查找到的文件;
-fls file:查找到的所有文件的长格式信息保存至指定文件中
例如[root@centos7 ~]# find -name data -fls fi
-ok COMMAND {} \;对查找到的每个文件执行由COMMAND 指定的命令,但是对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \;对查找到的每个文件执行由COMMAND 指定的命令
{}:上面的大括号用于引用查找到的文件名称自身
find 传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令,有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题
find | xargs COMMAND
示例如下:
#find -name “*.conf” -exec cp {} {}.orig \;
• 备份查找到的符合要求的所有配置文件,添加.orig这个扩展名
#find /tmp -ctime +3 -user joe -ok rm {} \;
• 提示删除存在时间超过3天以上joe的临时文件
#find ~ -perm -002 -exec chmod o-w {} \;
• 在你的主目录中寻找可被其它用户写入的文件
#find /data –type f -perm 644 -name *.sh -exec chmod 755 {} \;
# #find / -nouser -o –nogroup –atime -7 | xargs chmod o+x
6)、压缩、解压缩及归档工具
①、compress [-dfvcVr] [-b maxbits] [file …]
#compress file ,把file压缩为file.Z,同时原file不再存在
-d: 解压缩,相当于uncompress,原文件不再存在
例如#compress -d file.Z ,把file.Z解压缩为file,同时file.Z不再存在
-c: 结果输出至标准输出即是屏幕, 不删除原文件
例如#compress -c file > file.Z
-v: 显示详情
uncompress 解压缩
zcat file.Z >file
其中#zcat file.Z 直接打印于屏幕
# zcat file.Z >file把file.Z定向解压为file,同时不删除file.Z原文件
②、gzip [OPTION]… FILE …
-d: 解压缩,相当于gunzip,原文件不再存在
例如[root@centos7 testdir]# gzip fstab messages,结果是fstab.gz、messages.gz
[root@centos7 testdir]# gzip fstab.gz、messages.gz,结果是fstab messages
-c: 将压缩或解压缩的结果输出至标准输出,不删除原文件
-#:1-9 ,指定压缩比,值越大压缩比越大
zcat :不显式解压缩的前提下查看文本文件内容
实例:
gzip -c messages > messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
③、bzip2 [OPTION]… FILE …
-k: keep,保留原文件
-d:解压缩
-#:1-9,压缩比,默认为6
bzcat:不显式解压缩的前提下查看文本文件内容
例如#bzcat messages.bz2 > messages 如果不重定向,则会打印于屏幕上
④、xz [OPTION]… FILE …
-k: keep,保留原文件
-d :解压缩
-# :1-9,压缩比,默认为6
xzcat: 不显式解压缩的前提下查看文本文件内容
⑤、zip/unzip
打包压缩
#zip -r sysconfig.zip sysconfig/,即是把sysconfig/打包压缩为sysconfig.zip
#zip messages会提示错误,因为zip不能直接压缩单个文件
解包解压缩
#unzip sysconfig.zip
#cat /var/log/messages | zip message –
#cat /var/log/messages | zip message.zip –,用于压缩单个文件,生成压缩文件message.zip
#unzip -p message > message,重定向输出到message,否则不显式解压缩的前提下查看文本文件内容
练习题:
1 、查找/var 目录下属主为root ,且属组为mail 的所有文件
#find /var –user root -group mail -ls
2 、查找/var 目录下不属于root 、lp 、gdm 的所有文件
#find /var ! \(-user root -o -user lp -o -user gdm\) -ls
#find /var ! -user root !-user lp ! -user gdm -ls
其中第一条命令中括号要进行转义
3 、查找/var 目录下最近一周内其内容修改过,同时属主不为root ,也不是postfix 的文件
#find /var mtime -7 ! -user root ! -user postfix –ls
4 、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
#find / -nouser -o –nogroup –atime -7 | xargs ls –ld
#find / \(-atime -7 -nouser -o -nogroup\) –ls
#find / -atime -7 -nouser -o -nogroup -ls 缺少括号不能达到题目要求
5 、查找/etc 目录下大于1M 且类型为普通文件的所有文件
#find /etc -size +1M –type f –ls
#find /etc -size +1M -size -10M –type f -ls
6 、查找/etc 目录下所有用户都没有写权限的文件
#find /etc !-perm /222 –ls
7 、查找/etc 目录下至少有一类用户没有执行权限的文件
#find /etc ! -perm -111 -ls
8 、查找/etc/init.d 目录下,所有用户都有执行权限,且其它用户有写权限的文件
#find /etc/init.d/ -perm -113 –ls
因为/etc/init.d是链接目录,所以命令中要写成/etc/init.d/的形式
原创文章,作者:18612763863,如若转载,请注明出处:http://www.178linux.com/35858