文件查找

文件查找

目录

1.查找命令分类
2.locate
3.find
4.zgrep/grep
5.补充

1.查找命令分类

文件查找的命令有:locate,find,zgrep/grep
在这里我按照自己的理解把有关文件搜索查找的命令分为以下几类。
非实时查找(数据库查找):locate
实时查找:find,zgerp/grep
根据文件的元数据查找:locate,find,grep
根据文件的数据查找:zgrep/grep

2.locate

locate命令用于查询系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db。而索引的构建是在系统较为空闲的时候自动进行的(周期性任务)。
当然,管理员也可以手动更新数据,使用undatedb命令,但请谨慎使用!!这是因为索引构建过程是需要遍历整个根文件系统的,这就极其消耗资源,所以系统才会在空闲时间构建。
locate命令的工作特点:查找速度快;模糊查找;非实时查找;搜索的是文件的全路径,不仅仅是文件名;可能只搜索用户具备读取和执行权限的目录。
下面说下locate命令的常用到的:

locate - find files by name
locate [OPTION]... PATTERN...
-i:不区分大小写的搜索
-n N: 只列举前N 个匹配项目
-r, --regexp REGEXP:可以使用正则表达式来进行搜索
--regexp:可以使用扩展的正则表达式来进行搜索

大家可以通过locate --help来查看更多的选项信息,这里简单列举个例子:

搜索名称或路径中带有“conf”的文件
locate conf
搜索以“.conf”结尾的文件
locate -r ".conf$"
locate --regexp ".conf$"

因为locate是非实时查找,所以搜索到的文件数据不一定是最新的,虽然可以通过undatedb进行更新,但真的不建议用,特别是在工作环境中。

3.find

find命令是实时查找命令,是通过遍历指定路径来完成文件查找的。
find命令的工作特点:查找速度略慢;精确查找;实时查找;可能只搜索用户具备读取和执行权限的目录。
find命令的用法:

find - search for files in a directory hierarchy
find [OPTION]... [ 查找路径] [ 查找条件] [ 处理动作]

查找路径:指定具体目标路径;默认为当前目录
查找条件:指定查找的标准;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做些操作;默认屏幕输出
下面具体说下都有那些查找条件和处理动作

(1)查找条件

搜索层级:

-maxdepth level :最大搜索目录深度, 目录为第几级
-mindepth level :最小搜索目录深度

根据文件名和inode查找:

-name " 文件名称":支持使用glob(通配符),*, ?, [], [^]
-iname " 文件名称":不区分字母大小写
-inum n:按inode 号查找
-samefile name:相同inode 号的文件
-links n:链接数为n 的文件
-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

根据属主、组查找:

-user USERNAME:查找属主为指定用户的文件
-group GRPNAME:查找属组为指定组的文件
-uid UserID:查找属主为指定的UID 号的文件
-gid GroupID:查找属组为指定的GID 号的文件
-nouser :查找没有属主的文件
-nogroup:查找没有属组的文件

根据文件类型查找:

-type TYPE:TYPE是以下选项:
f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块设备文件
c:字符设备文件
p:管道文件

组合条件:

-a:与
-o:或
-not , !:非
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

根据文件大小来查找:

-size [+|-] UNIT:常用的单位是c,k,M,G
UNIT:为(UNIT-1,UNIT],如6k表示(5k,6k]
-UNIT:为[0,UNIT-1],如-6k表示[0,5k]
+UNIT:为[UNIT,∞ ),如+6k表示[6k,∞ )

根据时间戳进行查找:

-atime [+|-] num:是以天为单位的,且表示法同上所示。
num:[num,num+1)
+num:[num+1, ∞ ]
-num:[0,num)
-mtime:以天为单位,格式同上
-ctime:以天为单位格式同上
-amin:以分钟为单位,格式同上
-mmin:以分钟为单位,格式同上
-cmin:以分钟为单位,格式同上

根据权限查找:

-perm [/|-] MODE
MODE:权限的精确匹配
-MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可。
/MODE:每一类对象必须同时匹配指定的权限。
0:0所在类表示对这类权限不关注

(2)处理动作

-print:默认的处理动作,显示至屏幕
-ls :类似于对查找到的文件执行“ls -l” 命令
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} :对查找到的每个文件执行由 COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} :对查找到的每个文件执行由COMMAND 指定的命令
{}:用于引用查找到的文件名称自身
-prune:如果文件是个目录,则目录下的所满足条件的文件也不选择, 用于排除

注意
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令

下面具体下几个例子供大家参考:
1.查找/var 目录下属主为root ,且属组为mail 的所有文件:

2.查找/var目录下最近一周内其内容修改过,同时属主不为root ,也不是postfix 的文件:

3.查找/etc 目录下所有用户都没有写权限的文件:

4.zgrep/grep

zgrep/grep命令是实时查找命令,是通过遍历指定路径来完成文件查找的。
zgrep 命令的功能是在文件数据中寻找匹配正则表达式所描述字段(范本样式)的文件,也就是说,它找的是文件数据而不是文件元数据,根据你所需要找到文件数据(范本样式)而来找到包含这个数据(范本样式)的文件。用法和grep命令一样,man帮助上面说是主要针对压缩文件的,实际上什么文件都可以操作(我已知的)。
grep命令不管是根据文件元数据还是文件数据都可以查找到所需的文件,比zgrep强大。
这里列几个有关根据所需内容(范本样式)来查找文件的zgrep用法:

zgrep - search possibly compressed files for a regular expression
zgrep [ grep_options ] [ -e ] pattern filename...
-l <范本样式>:列出文件内容符合指定的范本样式的文件名称。
-h <范本样式>:在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H <范本样式>:在显示符合范本样式的那一列之前,标示该列的文件名称。
-e <范本样式>:指定字符串作为查找文件内容的范本样式。
-e :实现多个选项间的成逻辑or关系,grep –e ‘cat ’ -e ‘dog’ file

上面提到过find的命令处理动作中有关对找到的每个文件执行command的用法,这就是把每个文件作为参数来进行操作,实际上有个专门的命令可以做到,那就是xargs。

5.补充:参数替换命令xargs

由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
xargs 用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将stdin 的数据分隔成为arguments
有些命令不能接受过多参数 ,命令执行可能会失败,xargs也可以解决这个问题。也就是我提到的find命令找到大量文件,可以通过xargs来进行处理的原因。

xargs - build and execute command lines from standard input
xargs [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null] [-d delimiter] [--delimiter delimiter] [-I replace-str] [-i[replace-str]] [--replace[=replace-str]] [-l[max-lines]] [-L max-lines] [--max-lines[=max-lines]] [-n max-args][--max-args=max-args] [-s max-chars] [--max-chars=max-chars] [-P max-procs] [--max-procs=max-procs] [--process-slot-var=name] [--interactive] [--verbose] [--exit] [--no-run-if-empty] [--arg-file=file] [--show-limits][--version] [--help] [command [initial-arguments]]

从上面可以看到xargs的选项好多好多,这里就不在一一描述了,这里有需要注意的是,当管道前的命令的标准输出作为xargs的参数时,要注意其格式,要注意文件名或者是其他意义的名词内含有空格符的情况。
示例:

ls f* |xargs rm
find /sbin -perm +700 |ls -l :这个命令会提示错误,下面才是正确的。
find /sbin -perm +7000 | xargs ls –l

上述就是我目前为止所知的文件查找命令,能力有限,不对的地方欢迎纠正。

原文地址:https://www.cnblogs.com/shenxm/p/7616188.html