linux查找命令locate、find

本次博主来介绍下超实用的查找命令,没有查不到,只有做不到。

直接上干货:查找命令:locate和find,常用find,我们重点介绍find

locate

通过查询系统上预建的文件索引数据库全盘查找所需文件,locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在执行loacte时直接找该索引,查询速度会较快,索引的构建是在系统较为空闲时自动进行(周期性任务),索引构建过程需要遍历整个根文件系统,极消耗资源。

索引数据库:/var/lib/mlocate/mlocate.db

管理员可以手动更新数据库(命令:updatedb),在内定值中,updatedb每天执行一次可以修改crontab来更新设定值。(etc/crontab)

工作特点:

查找速度快

模糊查找

非实时查找

搜索的是文件的全路径,不仅仅是文件名

只搜索用户具备读取和执行权限的目录

接下来简单介绍几个常用选项

-i 不区分大小写的搜索

-n N 只列举前N 个匹配项目

-c –count 只显示搜索匹配到的个数

-r –regexp REGEXP搜索基本正则表达式 REGEXP 来代替模式

–regex模式是扩展正则表达式

示例:

[root@localhost ~]#locate -n 10 install     #取全盘查询包含install字符的文件的前10个
[root@localhost ~]#locate -r "install$"      #利用基本正则表达式取全盘中以install结尾的文件
[root@localhost ~]#locate -ir "install$"      #不区分大小写利用基本正则表达式取全盘中以install结尾的文件
[root@localhost ~]#locate -icr "[0-9]\{1,\}\/install$" 
-----#利用基本正则表达式查询表统计匹配数 注意c加在r前面
[root@localhost ~]#locate -ic --regex "[0-9]{1,}/install$"
-----#利用拓展正则表达式查询表统计匹配数 

find

find命令是一个实时查找工具,通过遍历指定路径而完成对文件的查找;在使用该命令时,如果不选定参数,则在当前目录下查找子目录与文件并显示;另外,任何位于参数之前的字符串,都将视为欲查找的目录名。

工作特点:

查找速度略慢

精确查找

实时查找

可能只搜索用户具备读取和执行权限的目录

find语法:

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

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

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

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

查找条件 :

1. 根据文件名和inode查找
  2. 根据属主、属组查找
  3. 根据文件类型查找
  4. 根据逻辑组合条件查找
  5. 根据文件大小来查找
  6. 根据时间戳来查找
  7. 根据权限来查找


根据文件名和inode查找:

-name “文件名称“: 支持使用glob,*, ?, [], [^]

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

-inum n: inode号查找

-somefile name: 相同的inode号文件

-links n: 链接数为n的文件

-regex 支持正则默认为(emacs标准)

   -regextype egrep -regex
支持
egrep同标准的正则支持更多表达式,比如:[[:digit:]][[:alpha:]]…….

示例:

[root@localhost ~]#find / -name insta       #精确查找,系统中无此文件
[root@localhost ~]#find / -name insta??    
/sys/fs/selinux/class/db_procedure/perms/install
/sys/fs/selinux/class/x_colormap/perms/install
/usr/bin/install             #支持通配符查找
[root@localhost app]#ln passwd mima       #通过设置硬链接,创建两个不同文件名的相同文件(inode)
[root@localhost app]#find -samefile mima    #查找相同inode号的文件
./passwd
./mima                       
[root@localhost app]#find -links 2      #查找链接数为2的文件
.
./passwd
./mima
[root@localhost app]#

根据属主属组查找:

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

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

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

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

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

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

示例:

[root@localhost etc]#find -user wangcai   #查找属主为wangcai的文件
[root@localhost etc]#find -group wangcai      #查找属组为wangcai的文件
[root@localhost etc]#find -nouser     #查找没有属主的文件
[root@localhost etc]#find -nogroup    #查找没有属主的文件

根据文件类型查找:

-type TYPE:

f: regular file普通文件

d: directory 目录文件

l: symbolic link符号链接文件

ssocket 套接字文件

b: block (buffered) special 块设备文件

c: character (unbuffered) special字符设备文件

p: named pipe (FIFO)管道文件

此处不做示例,格式为:find -type f


根据逻辑组合条件查找:

组合条件:

与:-a

或:-o

非:-not,
!

摩根定律:

(P) 或(非Q) = (PQ)

(P) (Q) = (PQ)

示例:

[root@localhost ~]#find /tmp \( -not -user root -a -not -name 'f*' \)
     #摩根定律找出/tmp目录下,属主不是root,且文件名不以f开头的文件
[root@localhost ~]#find /tmp -not \( -user root -o -name 'f*' \)
     #摩根定律找出/tmp目录下,属主不是root,且文件名不以f开头的文件

文件大小查找:

-size [+|-]#UNIT

常用单位:k,M,G

#UNIT:
(#-1,#]    
如:5M 表示 (4M,5M]

-#UNIT:
[0,#-1]    
如:-5M 表示 [0,5M]

+#UNIT:
(#,oo)    
如:+5M 表示 (6M,oo)

关于文件大小查找的解释:为什么-size 5M 不是找精确的5M而是表示(4M,5M], 试想文件的大小指什么?是指文件数据的大小还是包括了元数据后的大小,文件的大小肯定是包含元数据后大小的,而我们一般以文件大小找文件时往往考虑的是文件整个数据的大小;另外,精确查找一定大小的文件意义不大;所以这里的大小会有1个单位的浮动。

示例:

[root@localhost etc]#find -size 3M #查找文件大小在[3,4)M(大于等于3M小于4M)之间的文件
[root@localhost etc]#find -size -3M     #查找文件大小在[0,3)M之间的文件
[root@localhost etc]#find -size +3M    #查找文件大小在(3,∞)M之间的文件

根据时间戳查找:

以”天”为单位:-atime/-mtime/-ctime通用

-atime [+|-]#

#: [#,#+1)

+#:
[#+1,oo)

-#: [0,#)

同理:以“分钟”为单位:-amin/-mmin/-cmin通用

关于时间戳查找的解释:为什么-atime 3 表示的是[3,4),我们这儿所说的时间是指时间段而非时刻,一“天”与一“分钟”都是指一个时间段,只有[3,4)这个半闭半开的区间才能完整地表示第三天。

linux查找命令locate、find

根据权限查找:

-perm [/|-]MODE

MODE: 精确匹配权限

/MODE: 任何一类(u,g,o)对象的权限中只要能一位匹配即可,属于或关系。以前用‘+’,CentOS 7‘/’替代之

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

0:表示不关注

示例:

[root@localhost etc]#find -perm 644    #表示要严格查找匹配644的文件
[root@localhost etc]#find -perm +222    #表示u,g,o任何一类用户有写权限即查找匹配
[root@localhost etc]#find -perm -222    #表示仅严格查找匹配写权限,即每个用户必须要有写权限
[root@localhost etc]#find -perm -002   # 表示仅严格查找匹配other用户的写权限

处理动作:

1. -print: 默认动作,显示至屏幕

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

3. -delete: 删除查找到的文件

4. -fls file: 查找到的所有长格式的信息保存至指定文件中

5. -ok COMMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,且都会交互式要求用户确认

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

7. {}: 用于引用查找至的文件名称自身

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

9. 有些命令不能接受过多的参数,此时命令执行可能会失败,用 xargs 来规避此问题 find |xargs COMMAND

示例:

[root@localhost etc]#find -perm 644 -print   #查找到的结果显示在屏幕上
[root@localhost etc]#find -perm +222-ls   #对查找到的结果长列出
[root@localhost etc]#find -perm -222 -delete    #对查找到的结果进行删除
[root@localhost etc]#find -perm -002 -ok cp {} /tmp \;   #对查找到的结果进行操作(拷贝结果到其他目录下)且会交互式要求用户确认, 注意:-ok 结尾必须是以空格加斜杠再加分号 \;
[root@localhost etc]#find -perm -002 -exec cp {} /tmp \;   #对查找到的结果进行操作(拷贝结果到其他目录下)不会交互式要求用户确认, 注意:-exec 结尾必须是以空格加斜杠再加分号 \;

原创文章,作者:Mozart,如若转载,请注明出处:http://www.178linux.com/84400

(0)
MozartMozart
上一篇 2017-08-12 16:52
下一篇 2017-08-12 17:45

相关推荐

  • chrony、sudo、rsyslog

    chrony 程序环境: 配置文件:/etc/chrony.conf 主程序文件:chronyd 工具程序:chronyc unit file: chronyd.service 配置文件:chrony.conf server:指明时间服务器地址; allow NETADD/NETMASK allow all:允许所有客户端主机; deny NETADDR/N…

    Linux干货 2017-06-13
  • Raid的工作原理

    1,什么是Raid Raid的基本原理就是把多个磁盘组合到一起,组成一个磁盘组,使性能达到或超过一个容量巨大价格昂工艺的磁盘,当然基于硬件的RAID解决方案比基于软件RAID技术在使用性能和服务性能上稍胜一筹,具体表现在检测和修复多位错误的能力、错误磁盘自动检测和阵列重建等方面。 2.RAID级别介绍;一般常用的RAID阶层,分别是RAID 0、RAID1、…

    Linux干货 2017-06-19
  • 负载均衡一个PHP应用

    1、mariadb、nfs服务器的设置 (centos 7) [root@localhost ~]# rpm -q rpcbind rpcbind-0.2.0-32.el7.x86_64 [root@localhost ~]# rpm -q nfs-utils (默认n…

    Linux干货 2016-10-31
  • bash的基础特性[更新中]

    2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
    3、请使用命令行展开功能来完成以下练习:
    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
    (2)、创建/tmp/mylinux目录下的:
    mylinux/
    ├── bin
    ├── boot
    │   └── grub
    ├── dev
    ├── etc
    │   ├── rc.d
    │   │   └── init.d
    │   └── sysconfig
    │   └── network-scripts
    ├── lib
    │   └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │   └── local
    │   ├── bin
    │   └── sbin
    └── var
    ├── lock
    ├── log
    └── run
    5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
    6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
    7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
    8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
    9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
    10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
    11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
    12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

    2018-03-17
  • Shell脚本编程之入门基础(二)if、case的使用

    Shell编程之条件选择和条件判断   一、条件选择(if)与条件判断(case)的对比: if语句:是选择执行,if语句可嵌套。 if条件选择使用格式 单分支 双分支 多分支 if 判断条件;then 条件为真的分支代码 fi if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi if CONDITION1; the…

    Linux干货 2016-08-15
  • redis/twemproxy 客户端连接异常

    对于一个DBA,客户端连接异常问题可以说是家常便饭的事情,处理多了都想吐。 root cause无疑发生在三个地方,先找自身的原因,依次排查下去: 1)服务器端db的负载,如果负载太高,创建socket太慢引起超时。另外服务器端socket的个数太多,也可以导致创建连接需要很长的时间或者创建连接不成功。 2)网络是够有抖动,包括lvs/twemproxy重启…

    Linux干货 2015-04-03