linux下的文件查找

前言

文件查找:

在文件系统上查找符合条件的文件;

这与grep是完全不同的,grep是文本处理工具。find与locate是针对于文件的而不是文件中的文本内容。

文件查找常用工具:locate, find

区别:  非实时查找(数据库查找):locate

实时查找:find

locate:

locate的工作机制:

依赖于事先构建的索引库;索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新数据库(updatedb);

索引库的构建方式一般有两种:

  • 系统自动实现;(系统在较为空闲的时候自动进行(周期性的任务)),在操作系统刚装完是没有的。但是操作系统可能定义了一些任务在一段时间后会由某个程序实现自动构建。
  • 手动更新数据库使用updatedb这个命令。

索引构建过程需要遍历整个根文件系统,极消耗资源;

locate索引库的构建具体过程:

系统的周期性的任务程序会遍历整个文件系统。生成一个由keyword和keword的文件路径组成的 K-V数据库,也就是索引库。

但locate查找某个文件时。locate会去查找索引库,并对keword进行模糊匹配。但是索引库不是实时更新的。也就是说,如果A文件在索引库这次更新和下次更新之间被删除了。那么locate可以查到A文件,但是实际上A文件已经不存在了。你只能在下次索引库更新后才能使用locate发现A文件不见了。强调一下,索引库里记录的是文件路径。也就是说locate查找得到的结果是文件存在的路径。

工作特点:

  • 查找速度快;
  • 模糊查找;
  • 非实时查找;可能有部分结果不准确。

locate用法:

locate [OPTION]... PATTERN...

-A ,--all 同时满足所有的 PATTERN才可以。

-b ,--basename只匹配路径当中的基名。

-c,--count。不把查找结果显示出来而是把复合条件数目的统计出来。

-r, 支持基本的正则表达。若不加则不支持。

find:

find工作机制:

实时查找工具,通过遍历指定路径下的文件系统完成文件查找;

工作特点

  • 查找速度略慢;
  • 精确查找;
  • 实时查找;

find语法:

find [OPTION]... [查找路径] [查找条件] [处理动作]

  • 查找路径:指定具体目标路径;默认为当前目录;
  • 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件;
  • 处理动作:对符合条件的文件做什么操作;默认输出至屏幕;
  1. 查找条件:
  1. 根据文件名查找:

-name "文件名称":支持使用glob风格。

*, ?, [], [^]

例子 find /etc/  -name

-iname "文件名称":不区分字母大小写

-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;

2.根据属主、属组查找:

-user USERNAME:查找属主为指定用户的文件;

-group GRPNAME: 查找属组为指定组的文件;

-uid UserID:查找属主为指定的UID号的文件;

-gid GroupID:查找属组为指定的GID号的文件;

-nouser:查找没有属主的文件;

-nogroup:查找没有属组的文件;

3.根据文件类型查找:

-type TYPE:

f: 普通文件

d: 目录文件

l: 符号链接文件

s:套接字文件

b: 块设备文件

c: 字符设备文件

p: 管道文件

4.组合条件:

与:-a

或:-o

非:-not, !

!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

5.根据文件大小来查找:

-size [+|-]#UNIT

常用单位:k, M, G                                   #UNIT: (#-1, #]  精确查找,例如:find /etc -size 5k 表示 查找文件大小为大于4k小于等于5k的文件。(4,5]k                                    -#UNIT:[0,#-1] 例如:find /etc -size -5k 表示查找文件大小大于等于0k且小于等于4k的文件[0,5-1]k                                  +#UNIT:(#,oo)例如:find /etc -size +5k 表示查找文件大小大于5k的文件。(5k,+∞)

6.根据时间戳:

以“天”为单位;

-atime 表示访问时间 。[+|-]#。                                   a.  #: [#,#+1)  例如:find  /etc -atime 3 表示以现在查找的时间为基准,过去[3×24小时,4×24)之间被访问过的文件

如图:

b. +#: [#+1,oo] 例如 :find /etc -atime +3 表示以现在查找的时间为基准,过去4×24小时之前被访问过的文件。包括从现在时刻之前的4×24小时这个时刻。

如图:

                             ·

c. -#: [0,#) 例如:find /etc -atime -3 表示以现在查找的时间为基准,过去(3×24小时,0×24小时]包含现在时刻被访问过的文件。就是3天内。

-mtime 表示修改时间

-ctime 表示改变时间

以“分钟”为单位:

-amin

-mmin

-cmin

用法同上。

 总结几个特殊的:

一天内 find /etc -atime 0 或者 find /etc -atime -1

一天前 find /etc -atime  +0

两天前 find /etc -atime +1

两天内 find /etc -atime -2

6.根据权限查找:

-perm [/|-]MODE                                    a. MODE: 精确权限匹配 表示完全精确匹配。

示例:查找/etc 下权限为644的文件

find /etc -perm 644

b. /MODE:任何一类(u,g,o)用户的任何一位(r,w,x)符合条件即满足;9个权限位只要有一个满足就满足。

示例:

查找/etc下至少一类用户有写权限。

find /etc -perm /222

查找/etc下所有用户都没有写权限

find /etc -not -perm /222

查找/etc下至少一类用户有执行权限。

find /etc -perm /111

查找/etc下其他用户有执行权限。

find /etc -perm /001

注意:这里的0并不是没有任何权限的意思。而是指任意权限,不关心属主和属组的权限是什么。只关心其他用户有x权限。

补充:在操作系统上其他用户有写权限的文件是很危险的。不建议这么设定。所以可以 find  /PATH/SONMEFILE  -perm /002 找出来。

c.  -MODE:每一类用户(u,g,o)的权限中的每一位(r,wx)同时符合条件即满足;

示例:

查找/etc下每一类用户都有写权限的文件

find /etc -perm -222。

查找/etc下至少有一类用户没有写权限的文件。

find /etc -not -perm -222。

特殊的:

查找/etc 下其他用户有写权限的文件。

find /etc -perm /002 或者 find /etc -perm -002 二者效果一样的因为我们不关心属主和属组的权限是什么。

但是find  /etc -perm /022 与 find  /etc -perm -022 就不同了。前者表示属组或者其他用户有写权限。后者表示属组与其他用户都有写权限。

B. 处理动作:

-print:默认的处理动作,显示至屏幕;

-ls:类似于对查找到的文件执行“ls -l”命令;

-delete:删除查找到的文件;

-fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定文件中;

-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;

对于每个文件执行命令之前,都会交互式要求用户确认;注意结尾的分号

-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;

{}: 用于引用查找到的文件名称自身;注意结尾的分号

示例:

查找 /tmp 下其他用户有写权限的文件并修改该文件文some.danger的格式

find /tmp -perm /002 -exec mv {} {}.danger \;

注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;有些命令不能接受过多参数,此时命令执行可能会失败;另一种方式可规避此问题:

find | xargs COMMAND

时间: 2024-10-25 17:23:52

linux下的文件查找的相关文章

Linux下的文件查找类命令(转载)

如何快速有效的定位文件系统内所需要查找的文件呢?Linux为我们提供了一些文件查找类的命令,我们需要掌握以下几个命令: http://blog.csdn.net/sailor201211/article/details/53290470 which 命令which会依照用户的PATH环境变量查找一个外部命令对应的可执行文件的路径.如: $ which gcc /usr/bin/gcc whereis 和which命令相比,whereis命令则可以定位一个外部命令的二进制文件.源代码文件及用户手册

linux下find(文件查找)命令的详解

文件查找命令locate和find详解 locate 配合数据库缓存,快速查看文件位置,非实时查找( 数据库查找) find 实际搜寻硬盘查询文件名称 ,实时查找 locate简介 locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息.Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件.为了避免这种情况,可以在

Linux下的文件查找命令——find

Linux下几个常见的文件查找命令: which       查看可执行文件的位置 whereis    寻找特定文件,查看文件的位置 locate       配合数据库查看文件位置 find          实际搜寻硬盘查询文件名称 通常情况下find命令并不是很常用,大家都优先使用whereis和locate命令来查找,因为whereis和locate命令都是利用数据库来查找文件所在,并没有实际查询硬盘,所以速度很快,节省时间.但是我们的find命令依然很强大,它的查找条件相当多,对于用

linux下的文件查找命令

文件查找:按照文件名或文件属性来搜索文件: 一)locate 模糊查找:        基于专用的数据库进行查找,数据库应该事先创建,并且定期更新:        可以使用updatedb命令手动更新locate数据库:        查找速度非常快,查找精确到非常有限: =============================================================二)find 精确查找:        查找精度高,速度略慢:        在指定的位置进行文件名或文

Linux下的文件查找命令--find

(   <文件有三个"时间">:http://zhweizhi.blog.51cto.com/10800691/1775447           ) 概述 find命令是通过遍历硬盘的方式查找指定名称的文件,因此其效率相比whereis 等指令,要慢许多. 下面介绍find命令的相关用法: 命令格式为: find pathname [option] [action] pathname(路径) 其中,pathname是要查找的路径(.表示当前路径,/表示根路径) 如 fin

linux下日志文件查找关键词

查找 /apps/tomcat/tomcat3/apache-tomcat-7.0.69/logs 目录下已.txt结尾的文件,在文件中搜索关键字 IfcmpEcrService并打印行号 find /apps/tomcat/tomcat3/apache-tomcat-7.0.69/logs -type f -name '*.txt'|xargs grep -rn "IfcmpEcrService" 结果如下,第一列是文件 第二列是行号 可以用 vi 查看文件 /apps/tomcat

linux环境下的文件查找命令--find

熟悉linux的伙伴都知道,在开源的linux环境中,最主要的思想就是一切皆文件,linux中的任何东西都可被看作文件,那么我们在使用这些文件的时候就面临一个问题如何查找一个文件,在这里我以CentOS6.5虚拟机为例,做演示. Linux下有多种查找文件指令:find.whereis.which和locate. ● which:查看可执行文件的位置 ● whereis:查看文件的位置 ● locate:配合数据库查看文件 ● find:实际搜寻硬盘查询 其中find是最常用和最强大的查找命令.

Linux基础之文件查找:locate、find

引言: 在学习Linux中的文件查找时,突然联想到平时用的搜索引擎,在生活中我们想获取什么信息,在google等搜索引擎里面敲入就能列出符合我们条件的相关信息.如果我们不满意搜索结果可以进一步精确我们想查找内容的搜索内容,这在Linux的文件查找中称为精确匹配,但是如果我们虽然知道我们想要的内容,但是找不到特别精确的言辞来形容它因此只能输入描述性内容为搜索条件,这种在Linux的文件查找中可以称为模糊匹配.本文的初衷是希望这篇文章可以解决大家在使用Linux的过程中不至于因为查找某个文件找不到而

谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH

谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH  PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23069658&id=4028681 学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续“上路”.回想起自己当年刚接触Linux时,不管是用源码包编译程序,还是程序运行时出现的和动态库的各种恩恩怨怨,心里那真叫一个难受.那时候脑袋里曾经