其中find主要是文件级别的查找,grep是字符串级别查找,主要查找文件内容。具体区别:
(1)find:是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。
(2)grep:是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。
(3)mlocate/locate 命令用来查找文件或目录,速度快。
find 是文件层次的查找(包括子目录,就是对当前路径树查找)
基本格式:find path name
1、按照文件名查找
(1)find /opt -name abc.txt #在/opt目录下查找文件abc.txt
(2)find /opt -name abc.txt #在/opt目录下文件abc.txt
(3)find /opt -name '*abc*' #使用通配符*。表示在/opt目录下查找文件名中含有字符串‘abc’的文件
(4)find / -name 'abc*' #表示当前目录下查找文件名开头是字符串‘abc’的文件
2、可指定文件类型查找
find / -name "abc*" -type d # 查找类型为目录类型
find / -name "abc*" -type f # 查找类型为文件类型
-type t
True if the file is of the specified type. Possible file types
are as follows:
b block special
c character special
d directory
f regular file
l symbolic link
p FIFO
s socket
3、控制目录查找深度 -maxdepth number
find / -name "abc*" -maxdepth 2 # 查找到二级目录
4、按照文件特征查找
时间:
(1)find / -amin -10 # 查找在系统中最后10分钟访问的文件(access time)
(2)find / -atime -1 # 查找在系统中最后24小时访问的文件
(3)find / -mmin -10 # 查找在系统中最后10分钟里修改过的文件(modify time)
(4)find / -mtime -2 #查找在系统中最后48小时里修改过的文件
补充:history 10 #表示查看系统最后使用的10条命令
大小:
(1)find / -size +100M #查找出大于100M字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)
(2)find / -size -100M #查找出小于100M的文件
其他:
(1)find / -empty # 查找为空的文件/夹
(2)find / -user ljw #查找属于用户是ljw的文件/夹
(3)find / -group ljw # 查找group(组)为ljw的文件/夹
5、使用混合查找方式查找文件
参数有: !、-and(-a)、-or(-o)
(1) find /opt -size +100M -and -mtime +10 #在/opt目录下查找大于100M并在最后10分钟内修改的文件
(2) find / -user ljw -or -user ljw1 #在/目录下查找多个用户是ljw或者ljw1的文件文件
(3) find /opt ! -user ljw #在/opt目录中查找所有不属于用户ljw的文件
基本格式:grep 字符串 路径
1、主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-i:不区分大小写
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行,即反向查找。
2、grep -r "字符串"
(1)grep 'test' d* #显示所有以d开头的文件中包含 test的行
(2)grep ‘test’ aa bb cc #显示在aa,bb,cc文件中包含test的行
(3)grep ‘[a-z]\{5\}’ aa #显示所有包含每行字符串至少有5个连续小写字符的字符串的行
(4)grep magic /usr/src #显示/usr/src目录下的文件(不含子目录)包含magic的行
(5)grep -r magic /usr/src #显示/usr/src目录下的文件(包含子目录)包含magic的行
(6)grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),
3、grep 命令可以结合其他命令使用,效果也很好。
例如利用通道 ‘|’ 查找文件
grep -Rl 'name' /opt # 查找文件内容。其中查找的字符串,写不写引号''号都可以。
递归查找文件,在路径/opt下(包括子目录),找出文件内容中含有字符串'找我'的文件。显示为路径和文件名。
1. find | grep name #查找目录
查找出当前目录和子目录的文件名中含有name的文件
即find查找出当前目录和子目录下的文件名,利用管道 | 交给grep过滤出含有name的那几行,间接查找出文件。
其中find和grep可字行添加所需参数。
2. find | xargs grep name # 查找文件内容
查找出当前目录和子目录的文件内容中含有name的行。
与 xargs 结合,可以传递各种选项来调整你的输出,并删除找到的那些文件。
3. ls | grep name # 查找文件
类似find | grep name,只是不能递归查找子目录下的文件名。
4. rpm -qa | grep '软件名' #查找安装的软件
对于文件数量庞大的时候,可以使用此方法查找
mlocate和locate 命令一样,下面就不在写locate了。至于mlocate和locate的关系,最后面会具体说一下。
mlocate命令其实是“find -name”的另一种写法,但是要比后者快得多。mlocate命令原理:先为整个文件系统创建索引数据库,之后搜索索引,所以速度快。
Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用mlocate命令查不到最新变动过的文件。为了避免这种情况,可以在使用mlocate之前,先使用updatedb命令,手动更新数据库。
1、使用命令
mlocate abc.txt #直接搜索文件
mlocate ~/m # 搜索用户主目录下,所有以m开头的文件。
mlocate /etc/abc # 搜索etc目录下所有以abc开头的文件。
mlocate -ie abc.txt #如果 abc.txt已经删除了,使用-e会检查文件是否真实存在,而不必updatedb;-i,忽略大小写
mlocate /etc/*abc #在/etc中查找类似abc的文件。
注意:对于新增文件应该先updatedb更新数据库,否则就搜不到,当然更新索引时,执行updatedb还是比较快的。
2、准备工作
先安装mlocate/locate工具命令,创建数据库(创建索引),以及更新数据库。
yum install mlocate
yum install updatedb
updatedb #updatedb更新数据库,即文件库。
3、整个mlocate工作其实是由四部分组成的:
/usr/bin/updatedb #主要用来更新数据库,可通过crontab自动完成的
/usr/bin/locate #查询文件位置的程序(查询时是改程序运行,进行查找),也可能是mlocate。
/etc/updatedb.conf #updatedb的配置文件,用来配置数据库中要放入或排除哪些目录和文件等
/var/lib/mlocate/mlocate.db #存放文件信息的文件,文件名和对于的目录。
4、mlocate默认不搜索的文件:
即写入updatedb的配置文件/etc/updatedb.conf的文件。
PRUNE_BIND_MOUNTS="yes"
PRUNEFS="ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf"
PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/afs /tmp /var/spool /media"
第一行 "yes":是否进行限制搜索。
第二行 排除检索的文件系统类型。
第三行 排除检索的后缀文件。
第四行 排除检索的路径,且对路径下的子文件夹也不检索。
5、关于mlocate和locate
mlocate有一个近亲:slocate,它安全地(注意前缀字母 s 代表安全)记录了相关的文件权限,以防止非特权用户看到特权文件。此外,还有它们所起源的一个更老的、原始的locate 命令。
mlocate 与其家族的其他成员(至少包括 slocate)的不同之处在于,在扫描文件系统,每次更新数据库时,mlocate 不需要持续重新扫描所有的文件系统。mlocate 在数据库中保存了时间戳信息,无需重新读取,就能判断目录内容是否改变。所以更新的速度更快,对硬盘的占用也更少。这是mlocate特有的功能。相反,它将其发现的文件(注意前面的m代表合并)与现有的文件列表合并在一起,使其可以借助系统缓存从而性能更高、更轻量级。由于mlocate流行,所以也简称其为 locate。
mlocate和locate 命令的一个关键组件,名为 updatedb,更新数据库的命令。
updatedb 通过cron任务定期运行,通常在一天中的安静时间运行。在文件 /etc/cron.daily/mlocate.cron 的内部(该文件的路径及其内容可能因发行版不同)。每天如何触发 “updatedb” 命令。关于mlocate配置文件内容可以参考文章:https://linux.cn/article-9053-1-rel.html
参考文件:https://linux.cn/article-9053-1-rel.html