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

引言

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



Linux查找工具

Linux中的查找工具有两个:locatefind

locate:非实时查找,根据索引查找

find:实时查找,遍历所有文件进行条件匹配



locate

locate属于非实时查找,它根据事先构建的索引数据库,匹配文件信息进而定位符合条件的文件。

其需事先构建的索引数据库在/var/lib/mlocate/mlocate.db,索引的构建过程需要遍历整个根文件系统,极其耗费资源,因此其常常在系统较为空闲时进行(通常设置自动执行),也可以进行手动更新数据库命令为:updatedb

locate的工作特性:查找速度快模糊查找非实时查找

命令使用格式

locate [option]...PATTEN...

-b:只匹配路径中的基名

-c:统计出共有多少个符合条件的文件

-r:BRE(基本正则表达式)

[[email protected] etc]# locate -c file
2540
[[email protected] etc]# locate -b pwd
/etc/.pwd.lock
/usr/bin/pwd
/usr/bin/pwdx
/usr/lib/modules/3.10.0-327.el7.x86_64/kernel/drivers/watchdog/hpwdt.ko
/usr/lib64/cracklib_dict.pwd
/usr/lib64/python2.7/lib-dynload/spwdmodule.so
/usr/sbin/unix_chkpwd
/usr/share/cracklib/cracklib-small.pwd
/usr/share/cracklib/pw_dict.pwd
/usr/share/man/man0p/pwd.h.0p.gz
/usr/share/man/man1/pwd.1.gz
/usr/share/man/man1/pwdx.1.gz
/usr/share/man/man1p/pwd.1p.gz
/usr/share/man/man3/lckpwdf.3.gz
/usr/share/man/man3/ulckpwdf.3.gz
/usr/share/man/man8/unix_chkpwd.8.gz
/usr/share/man/overrides/de/man1/pwdx.1
/usr/share/man/overrides/fr/man1/pwdx.1
/usr/share/man/overrides/uk/man1/pwdx.1
[[email protected] test]# locate -r ‘.*scrip2$‘ 
/test/scrip2
[[email protected] test]#

上面演示了locate的三种选项的简单用法



find

find属于实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找。

它的工作特性:查找速度略慢、精确查找、实时查找。

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

查找路径:指定具体目标路径;默认为当前目录

查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

处理动作:对符合条件的文件做操作,默认输出至屏幕

………………………………………………………………………………………………………………………

查找条件:

表达式:选项和测试(常为布尔型)

………………………………………………………………………………………………………………………

根据文件名和inode查找

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

*, ?, [], [^]

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

-inumn 按inode号查找

-regex "PATTERN":基于正则表达式模式查找文件,匹配的是整个路径而非其名

示例:查找包含有字符串“what”的文件

[[email protected] test]# find / -name *what* -ls
72662849    4 drwxr-xr-x   2 root     root         4096 7月 20 00:36 /var/lib/yum/yumdb/v/9879449b2e44ada0445cf495a38c3fd10c942c54-virt-what-1.13-6.el7-x86_64
2536807    4 -rw-r--r--   1 root     root         2836 6月 10  2014 /var/cache/man/cat1/whatis.1.gz
35799386   48 -rwxr-xr-x   1 root     root        46456 6月 10  2014 /usr/bin/whatis
...

………………………………………………………………………………………………………………………

根据属主、属组查找

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

-group GRPNAME: 查找属组为指定组(GID)的文件

-uidUserID:查找属主为指定的UID号的文件

-gidGroupID:查找属组为指定的GID号的文件

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

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

示例:查看/下属于用户fedore的文件,或没有属主的文件

[[email protected] test]# find / -user fedore -ls
find: ‘/proc/10542/task/10542/fd/6’: 没有那个文件或目录
find: ‘/proc/10542/task/10542/fdinfo/6’: 没有那个文件或目录
find: ‘/proc/10542/fd/6’: 没有那个文件或目录
find: ‘/proc/10542/fdinfo/6’: 没有那个文件或目录
74331703    0 -rw-rw----   1 fedore   mail            0 8月  2 21:49 /var/spool/mail/fedore
1477708    4 drwx------   3 fedore   fedore       4096 8月 15 17:11 /home/fedore
35996645    0 drwxr-xr-x   4 fedore   fedore         37 7月 19 23:54 /home/fedore/.mozilla
73207822    0 drwxr-xr-x   2 fedore   fedore          6 6月 10  2014 /home/fedore/.mozilla/extensions
101849766    0 drwxr-xr-x   2 fedore   fedore          6 6月 10  2014 /home/fedore/.mozilla/plugins
1477714    4 -rw-r--r--   1 fedore   fedore         18 11月 20  2015 /home/fedore/.bash_logout
1477721    4 -rw-------   1 fedore   fedore        152 8月 15 17:11 /home/fedore/.history
2538688    4 -rw-r--r--   1 fedore   fedore        237 8月 15 16:45 /home/fedore/.bash_profile
2538686    4 -rw-r--r--   1 fedore   fedore        273 8月 15 16:49 /home/fedore/.bashrc
2356350    4 -rw-------   1 fedore   fedore        134 8月 15 17:01 /home/fedore/.Xauthority
[[email protected] test]# find / -nouser -ls
find: ‘/proc/10540/task/10540/fd/6’: 没有那个文件或目录
find: ‘/proc/10540/task/10540/fdinfo/6’: 没有那个文件或目录
find: ‘/proc/10540/fd/6’: 没有那个文件或目录
find: ‘/proc/10540/fdinfo/6’: 没有那个文件或目录
101603081    0 -rw-r--r--   1 4001     root            0 8月 14 14:47 /tmp/3fstab2

………………………………………………………………………………………………………………………

根据文件类型查找

-type TYPE:

f: 普通文件

d: 目录文件

l: 符号链接文件

s:套接字文件

b: 块设备文件

c: 字符设备文件

p: 管道文件

示例:查找/test下的普通文件

[[email protected] test]# find /test/ -type f -ls
1832646    4 -rwxr-xr-x   1 root     root          399 8月 16 20:44 /test/scrip2

………………………………………………………………………………………………………………………

组合条件

与:-a

    或:-o

    非:-not, !

示例:查找/tmp下属于root且文件类型为普通文件的文件

[[email protected] test]# find /tmp/ -user root -a -type f -ls
74330358    4 -rw-r-----   1 root     root         3092 8月 12 21:31 /tmp/vmware-root/vmware-apploader-6127.log
74330359    4 -rw-r-----   1 root     root         3092 8月 12 21:31 /tmp/vmware-root/vmware-apploader-6135.log
...

………………………………………………………………………………………………………………………

根据文件大小来查找

-size [+|-]#UNIT

常用单位:k, M, G

#UNIT: (#-1, #]

如:6k 表示(5k,6k]

-#UNIT:[0,#-1]

如:-6k 表示[0,5k]

+#UNIT:(#,∞)

如:+6k 表示(6k,∞)

示例:查找/etc下大于1M的文件

[[email protected] test]# find /etc -size +1M -ls   
102807508 1304 -rw-------   1 root     root      1333123 8月  2 10:09 /etc/selinux/targeted/contexts/files/file_contexts.bin
36013992 3688 -rw-r--r--   1 root     root      3773309 8月  2 10:09 /etc/selinux/targeted/policy/policy.29
72664102 6852 -r--r--r--   1 root     root      7014922 7月 20 00:38 /etc/udev/hwdb.bin
34828897 1336 -rw-r--r--   1 root     root      1367395 3月  6  2015 /etc/brltty/zh-tw.ctb

………………………………………………………………………………………………………………………

根据时间戳

以“天”为单位

-atime[+|-]#,

#: [#,#+1)

+#: [#+1,∞]

-#: [0,#)

-mtime

-ctime

以“分钟”为单位

-amin

-mmin

-cmin

示例:查找/etc文件夹下2天内被访问过的文件

[[email protected] test]# find /etc -atime -2 -ls
36017835    4 -rw-r--r--   1 root     root           19 7月 20 00:36 /etc/locale.conf
36017836    4 -rw-r--r--   1 root     root           22 7月 20 00:36 /etc/hostname
33554565    4 -rw-r--r--   1 root     root         1309 8月 17 08:03 /etc/tpvmlp.conf
...

………………………………………………………………………………………………………………………

根据权限查找

-perm [/|-]MODE

MODE: 精确权限匹配

/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,

“-perm +mode”从CentOS7后被“-perm /mode”格式替代

-MODE:每一类对象都必须同时拥有指定权限,与关系

示例:查找/tmp下至少有一类对象有写权限的文件

[[email protected] ~]# find /tmp -perm /222 -ls
100663425    4 drwxrwxrwt  15 root     root         4096 8月 17 17:36 /tmp
34305371    0 drwxrwxrwt   2 root     root            6 7月 20 00:04 /tmp/.Test-unix
69465462    0 drwxrwxrwt   2 root     root           15 8月 17 08:02 /tmp/.X11-unix
74098510    0 srwxrwxrwx   1 root     root            0 8月 17 08:02 /tmp/.X11-unix/X0
101599413    0 drwxrwxrwt   2 root     root            6 7月 20 00:04 /tmp/.XIM-unix
760765    0 drwxrwxrwt   2 root     root            6 7月 20 00:04 /tmp/.font-unix
34305372    4 drwxrwxrwt   2 root     root         4096 8月 17 08:03 /tmp/.ICE-unix
...

………………………………………………………………………………………………………………………

处理动作

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

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

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

-fls /PATH/TO/SOMEFILE:查找到的所有文件的长格式信息保存至指定文件中

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

对于每个文件执行命令之前,都会交互式要求用户确认

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

find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行可能会失败,下面方式可规避此问题

find | xargs COMMAND

示例:1)查找/test下名为scrip2的文件,并用cat查看其内容,使用两种方式;2)将搜索到的scrip2文件的长格式信息保存在/test/scrip1中

[[email protected] test]# find /test -name scrip2 -exec cat {} \;
#!/bin/bash
#
[ $# -lt 1 ] && echo "please give one IP address" && exit 1
[ $# -gt 1 ] && echo "this script just match one IP address" && exit 2
[ $# -eq 1 ] && [[ $1 =~ (([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\.){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]) ]] && ping -c 1 $1 | sed -n ‘2p‘|grep -o ‘^64‘ >> /dev/null && echo "该IP地址可访问" || echo "该IP地址不可访问"
[[email protected] test]# find /test -name scrip2 | xargs cat
#!/bin/bash
#
[ $# -lt 1 ] && echo "please give one IP address" && exit 1
[ $# -gt 1 ] && echo "this script just match one IP address" && exit 2
[ $# -eq 1 ] && [[ $1 =~ (([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\.){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4]) ]] && ping -c 1 $1 | sed -n ‘2p‘|grep -o ‘^64‘ >> /dev/null && echo "该IP地址可访问" || echo "该IP地址不可访问"

2)将搜索到的scrip2文件的长格式信息保存在/test/scrip1中

[[email protected] test]# find /test -name scrip2 -fls /test/scrip1
[[email protected] test]# cat scrip1
1832646    4 -rwxr-xr-x   1 root     root          399 8月 16 20:44 /test/scrip2


locate与find的不同

locate由于非实时因此会查找到最近删除的文件,而find则不会。上述的不同导致查找的结果有所不同。

示例:在/test/文件下有两个文件scrip1、scrip2,删除scrip1,然后在搜scrip1

[[email protected] test]# stat /var/lib/mlocate/mlocate.db    
  文件:"/var/lib/mlocate/mlocate.db"
  大小:2771084         块:5416       IO 块:4096   普通文件
设备:fd00h/64768d      Inode:35764072    硬链接:1
权限:(0640/-rw-r-----)  Uid:(    0/    root)   Gid:(   21/ slocate)
环境:system_u:object_r:locate_var_lib_t:s0
最近访问:2016-08-17 16:03:17.734189941 +0800
最近更改:2016-08-17 09:10:04.982775027 +0800
最近改动:2016-08-17 09:10:04.983775043 +0800
创建时间:-

先查看下该索引数据库的最新改动时间,该时间是上午的,所以现在我们删除scrip1文件后locate是可以搜到的。

[[email protected] test]# ll
总用量 8
-rw-r--r--. 1 root root  82 8月  17 18:03 scrip1
-rwxr-xr-x. 1 root root 399 8月  16 20:44 scrip2
[[email protected] test]# rm scrip1
rm:是否删除普通文件 "scrip1"?y
[[email protected] test]# ll
总用量 4
-rwxr-xr-x. 1 root root 399 8月  16 20:44 scrip2

删除scrip1,然后搜索它

[[email protected] test]# locate scrip1 
/test/scrip1
[[email protected] test]# find /test/ -name scrip1
[[email protected] test]#

比较结束。通过结果,如果我们要求搜索结果靠谱最好还是使用find。



时间: 2024-10-23 03:03:55

Linux基础之文件查找:locate、find的相关文章

1.9 linux基础(九)-文件查找find

1.9 linux基础(九)-文件查找find 1.9.1 文件查找 在文件系统上查找符合条件的文件 文件查找:locate, find 非实时查找(数据库查找):locate 实时查找:find 1.9.2 locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db 依赖于事先构建的索引 索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库 (updatedb) 索引构建过程需要遍历整个根文件系统,极消耗资源 工作特点: 查找速度快

Linux基础管理——文件查找和压缩(高级使用方法)

前言: GNU Linux操作系统的哲学思想之一即是一切皆是文件,因此使用必要的手段对文件进行搜索.匹配.处理.压缩解压,以实现快速定位.快速处置是十分必要的. 1.文件搜索查找原理 文件的搜索查找底层原理分为两类:实时的.非实时的.其中非实时的文件查找是基于数据库的,而实时查找则是基于查找条件对文件系统上的所有文件进行搜索.匹配,且是穷尽查找. 非实时查找的代表命令是locate:实时查找的代表是find命令. 1.1.locate原理及特点 原理: 查询系统上预建的文件索引数据库,/var/

linux基础之文件查找

文件查找 在文件系统上查找符合条件的文件: 实现工具:locate, find locate: 依赖于事先构建好的索引库: 系统自动实现(周期性任务): 手动更新数据库(updatedb): 工作特性: 查找速度快: 模糊查找: 非实时查找: locate  [OPTION]...  PATTERN... -b:只匹配路径中的基名: -c:统计出共有多少个符合条件的文件: -r:BRE(基于基本正则表达式) 注意:索引构建过程需要遍历整个根文件系统,极消耗资源: find: 实时查找工具,通过遍

Linux 系统之文件查找工具--- locate、 find详解

一.学习Linux为什么要学习文件查找工具? 作为Linux爱好者,或者Linux运维人员经常会遇到要查找某个或者某一类文件的问题,但对于"一切皆文件"的Linux系统来说,如何能够在成千上万的文件中快速精确的定位到我们所需的文件,对我们来说是至关重要的.因此,熟练掌握并运用Linux系统下的文件查找命令是我们快速定位的关键. 本文着重介绍Linux环境下的locate.find文件查找工具 二.文件查找工具locate使用详解 2.1.locate - find files by n

linux基础正则表达式、shell基础、文件查找和压缩

linux基础正则表达式.shell基础.文件查找和压缩 1.shell编程显示电脑的基本信息,初级基础脚本.只适合6.7版本的. COLOR="\033[1;36m" COLOREND="\033[0m" echo -e "CPU type is $COLOR `lscpu |grep 'Model name'|tr -s ' '|cut -d: -f2`$COLOREND" echo -e "Disk space is $COLOR

linux系统下文件查找

在我们实际应用中,经常需要查找某个特定的文件,或者根据文件的某个特定属性进行查找,今天小菜就给大家分享一下,linux系统下文件查找的两大利器: 1,locate:非实时查找(基于预先生成的数据库查找):模糊匹配:速度快 2,find:实时查找(遍历目录中的所有文件完成查找):精确匹配,支持众多查找标准:速度慢 一.locate 查询系统上预先生成的文件索引数据库:/var/lib/mlocate/mlocate.db 依赖于事先构建的索引:索引的构建是在系统较为空闲时自动进行(周期性任务) 管

Linux基础概念-----文件类型

普通文件:非目录或其他类型文件(-) 目录文件(d):Linux下目录也是文件,不过目录文件里面存放着是其他文件或目录的名字和对应的indoe号 indoe维基百科:inode是指在许多"类Unix文件系统"中的一种数据结构.每个inode保存了文件系统中的一个文件系统对象(包括文件.目录.设备文件.socket.管道, 等等)的元信息数据,但不包括数据内容或者文件名. 百度百科: inode 编号 用来识别文件类型,以及用于 stat C 函数的模式信息 文件的链接数目 属主的 UI

Linux 入门之文件查找(find、locate)命令

Linux入门之Find文件查找命令 在liunx中有很多文件查找工具,但是最常用的却是locate和find命令,他们都有多种条件进行文件搜索,当然各自也有不同的特点. locate 命令: 原理:此命令查询文件的准确度依赖于系统上预建的文件索引数据库文件: /var/lib/mlocate/mlocate.db [[email protected] ~]# ls -l /var/lib/mlocate/mlocate.db  -rw-r-----. 1 root slocate 213573

linux 文件查找 (locate 与 find)

文件查找 目录 1.locate2.find 一. locate locate命令基于数据库db,所以不能实时更新 他有如下的特点: 1.查找速度快 2.是模糊查找(可能搜到了文件,也有可能搜到了目录) 3.是非实时的查找 4.由于权限的原因可能只查找到一部分的文件 locate 参数: -i 不区分大小写 -n N 只列举前N个项目 -r 支持正则表达式 locate xiaoyu 搜索名称或路径中带有"xiaoyu"的文件 例: 二. find 实时查找工具,通过遍历指定路径完成文