文件查找
目录
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)处理动作
-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
上述就是我目前为止所知的文件查找命令,能力有限,不对的地方欢迎纠正。