LINUX实操:Linux文件查找命令(locate/find)

《LINUX实操:Linux文件查找命令(locate/find)》要点:
本文介绍了LINUX实操:Linux文件查找命令(locate/find),希望对您有用。如果有疑问,可以联系我们。

在用linux操作系统的时候,当我们忘记之前某个文件存储的位置,但是知道其文件名或者模糊的知道其文件名,我们都可以通过文件查找工具来查找,linux提供两种常用的查找工具,locate和find,在日常使用中后者比前者较前者功能更强大更具有实时性,下面我们就这两种工具来谈一谈她们的使用办法.

Locate

locate是基于实现构建好的索引库(索引库可以理解成文件路径的集合),索引库的位置放在/var/lib/mlocate/mlocate.db文件里面,系统一般一天会自动更新一次,也可以使用updatedb手动更新,要注意的是,索引库的构建过程必要遍历整个文件系统,非常消耗系统资源.

locate的特点是查找的速度快,比find快很多,因为它只在查找索引库,而find会遍历整个文件系统的路径.快的好处自然也给locate带来的缺点,便是它并非是实时查找,意思便是你如果刚刚创建了一个文件,但是你忘记了其路径,只记得其名称,那么这个时候就不建议使用locate,因为索引数据库没有更新,你使用locate查不到,除非你走运,定期更新的时间刚好在创建文件完文件之后,locate在匹配文件名的时候是模糊匹配.

下面我们就来先容一下locate的用法:

locate

NAME:通过文件名查找文件
SYNOPSIS:locate [OPTION]... PATTERN...
-b:只匹配路径中的基名;
-c:输出符合条件文件的数目
-r:使用基本正则表达式
--regex:使用扩展正则表达式
-i:忽略大小写
-q:宁静模式,不会有任何输出

举例1:查找含有"passwd"的文件名

[root@localhost ~]# locate  passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
/usr/bin/grub2-mkpasswd-pbkdf2
......(省略)
/usr/share/doc/passwd-0.79/AUTHORS
/usr/share/doc/passwd-0.79/COPYING
/usr/share/doc/passwd-0.79/ChangeLog
/usr/share/doc/passwd-0.79/NEWS
/usr/share/vim/vim74/ftplugin/passwd.vim
/usr/share/vim/vim74/syntax/passwd.vim

我们会发现,非基名中存在passwd也会被匹配出来,我们可以使用"-b"选项来匹配:

[root@localhost ~]# locate -b  passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
/usr/bin/grub2-mkpasswd-pbkdf2
/usr/bin/kdepasswd
/usr/bin/kpasswd
/usr/bin/lppasswd
/usr/bin/passwd
/usr/bin/vncpasswd
......
/usr/share/man/zh_CN/man8/chpasswd.8.gz
/usr/share/man/zh_CN/man8/smbpasswd.8.gz
/usr/share/man/zh_TW/man8/chpasswd.8.gz
/usr/share/ruby/webrick/httpauth/htpasswd.rb
/usr/share/vim/vim74/ftplugin/passwd.vim
/usr/share/vim/vim74/syntax/passwd.vim

看输出的显示成果,只有基名中含有"passwd"的才会被匹配
举例2:查找只有基名中含有"passwd"的文件名的数目

[root@localhost ~]# locate -bc  passwd
155

举例3:查找基名中只有"passwd"文件的文件

[root@localhost ~]# locate -br "\<passwd$"
/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd

updatedb的设置装备摆设文件在/etc/updatedb.conf

PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp"

PRUNE_BIND_MOUNTS:表现是否限制搜索

PRUNEFS:所列的文件系统,查找的时刻不进行查找

PRUNENAMES:所列的后缀名不进行查找

PRUNEPATHS:所列的文件路径下的文件不进行查找

及时性检测

[root@localhost etc]# touch mypasswd
[root@localhost etc]# 
[root@localhost etc]# locate mypasswd
[root@localhost etc]# 
[root@localhost etc]# updatedb
[root@localhost etc]# 
[root@localhost etc]# locate mypasswd
/etc/mypasswd

在etc下我们创建mypasswd,立马使用locate命令查找并不克不及查找,使用updatedb之后更新之后索引数据库之后就可以查找到了.

find

通过直面意思我们就知道find便是“查找”的意思,find的是一个实时查找命令,它会在查找的时候会遍历指定起始路径下文件系统层级结构完成文件查找,所以其缺点便是查找的速度要比locate慢.

下面我们就要介绍一下find的使用办法:

NAME:递归地在层次目录中处理文件
SYNOPSIS:find  [OPTIONS]  [查找起始路径]  [查找条件]  [处理动作]
查找路径:可以指定搜索目标的其实路径,默认为当前目录
查找条件:可以指定查找标准,可以根据文件名、大小、类型、从属关系、权限等匹配
处理动作:对符合查找条件的文件做出操作,好比删除等,默认行为为至标准输出

find的选项不常用,了解可使用man find来查看,下面主要来说明一下查找条件和处理动作,find的状态返回值为布尔值,查找的到则返回"0",查找不到则返回大于"0"的数字.

查找前提:

1.依据文件名查找

-name  "pattern"
-iname "pattern"   #支持的通配符的模式,i为不区分大小写
-regex "pattern"   #基于正则表达式模式查找文件,注意这里匹配的不是文件本身,而是包括这个文件路径

举例:

[root@localhost etc]# find /etc/ -name "passwd"    #搜索/etc目录下含有passwd的文件
/etc/pam.d/passwd
/etc/passwd
[root@localhost etc]# find /etc/ -iname "passwd"   #搜索/etc目录下含有passwd的文件,忽略字符大小写
/etc/pam.d/passwd
/etc/passwd
/etc/Passwd
[root@localhost etc]# find /etc/ -iname "passwd[0-9]"  #搜索/etc目录下含有passwd且后面还有0-9任意一个数字的文件
/etc/passwd1
[root@localhost etc]# find /etc/ -regex '/etc/passwd.?'  #搜索/etc目录下含基名以passwd开头且后面可以有任意字符也可以没有的文件
/etc/passwd
/etc/passwd-
/etc/passwd1

2.根据文件附属关系查找

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

举例:

[root@localhost ~]# find /tmp/ -user frank -ls   #输出tmp下属主是frank的文件,-ls后面再讲
9336543    0 drwx------   2 frank    frank          27 7月 16 04:46 /tmp/kde-frank
9357728    4 -rw-rw-r--   1 frank    frank         132 7月 16 04:46 /tmp/kde-frank/xauth-1000-_0
9357736    0 drwx------   2 frank    frank          34 7月 16 04:47 /tmp/akonadi-frank.yFqCJF
9357758    0 srwxrwxr-x   1 frank    frank           0 7月 16 04:46 /tmp/akonadi-frank.yFqCJF/akonadiserver.socket
27750615    0 drwx------   2 frank    frank           6 7月 16 04:47 /tmp/.esd-1000
[root@localhost ~]# find /tmp/ -group frank -ls  #输出/tmp目录下属组是frank的文件
9336543    0 drwx------   2 frank    frank          27 7月 16 04:46 /tmp/kde-frank
9357728    4 -rw-rw-r--   1 frank    frank         132 7月 16 04:46 /tmp/kde-frank/xauth-1000-_0
9357736    0 drwx------   2 frank    frank          34 7月 16 04:47 /tmp/akonadi-frank.yFqCJF
9357758    0 srwxrwxr-x   1 frank    frank           0 7月 16 04:46 /tmp/akonadi-frank.yFqCJF/akonadiserver.socket
27750615    0 drwx------   2 frank    frank           6 7月 16 04:47 /tmp/.esd-1000
[root@localhost ~]# find /tmp/ -uid 1000 #显示/tmp下uid为1000的文件
/tmp/kde-frank
/tmp/kde-frank/xauth-1000-_0
/tmp/akonadi-frank.yFqCJF
/tmp/akonadi-frank.yFqCJF/akonadiserver.socket
/tmp/.esd-1000
[root@localhost ~]# find /tmp/ -nouser  -ls  #显示/tmp下没有属主的文件,如果一个用户创建一个文件之后,用户被删除,则显示为本来的uid和gid,不会显示属组合属主
375722    0 -rw-rw-r--   1 1003     1003            0 7月 23 00:08 /tmp/mygrp.txt

3.根据文件类型查找

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

举例:

[root@localhost ~]# find /dev/ -type b  #查找dev目录下的块设备文件
/dev/dm-2
/dev/dm-1
/dev/dm-0
/dev/sr0
/dev/sda2
/dev/sda1
/dev/sda

4.根据文件年夜小查找

一般格式为 -size [+|-]#UNIT UNIT常用单元为:k,M,G

-size #UNIT:匹配的年夜小范围是#及年夜于#-1的文件

举例:匹配3K的年夜小,年夜于2K及小于等于3K的都会被匹配

[root@localhost ~]# ll -h
总用量 16K
-rw-------. 1 root root 2.1K 7月  16 04:45 anaconda-ks.cfg
-rw-r--r--. 1 root root 2.1K 7月  16 04:45 initial-setup-ks.cfg
-rw-r--r--. 1 root root  555 7月  19 10:04 TEST
-rw-------. 1 root root 3.0K 7月  23 00:23 test.txt
[root@localhost ~]# find  -size 3k -ls
27734414    4 -rw-------   1 root     root         2094 7月 16 04:45 ./anaconda-ks.cfg
27734452    4 -rw-r--r--   1 root     root         2142 7月 16 04:45 ./initial-setup-ks.cfg
25795843    4 -rw-------   1 root     root         3070 7月 23 00:23 ./test.txt

-size -#UNIT:匹配的范围是文件年夜小年夜于0且小于等于#-1的文件

dawei

【声明】:淮南站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。