• Linux学习笔记——文件的查找与检索


    文件的查找

    Linux的文件查找命令使用 find,其命令格式如下:

    find 搜索路径 [选项] 搜索内容
    
    • 1

    find 命令有三·个参数:

    • 第一个参数用来指定搜索路径;
    • 第二个参数用来指定按什么进行搜索,比如按文件名或者按文件大小等;
    • 第二个参数用来指定搜索内容。

    下面我们分类进行说明。


    按照文件名搜索

    选项:

    • -name:按文件名搜索;
    • -iname:按文件名搜索,不区分文件名大小;
    • -inum:按照 inode 号搜索。

    比如我们要搜索家目录下,文件名为 hello.c 的文件:


    当然也可以使用通配符:


    按照文件大小进行搜索

    选项:

    • -size [+/-] 大小 [b/c/w/k/M/G]

    这里的 + 表示搜索大于该大小的文件,而 - 就表示小于该大小的文件。而后面可选的单位有如下几种选项:

    'b' for 512-byte blocks (this is the default if no suffix is used)
    #这是默认单位,如果单位为b或不写单位,则按照 512Byte搜索
    'c' for bytes
    #搜索单位是c,按照字节搜索
    'w' for two-byte words
    #搜索单位是w,按照双字节(中文)搜索
    'k'for Kilobytes (units of 1024 bytes)
    #按照KB单位搜索,必须是小写的k
    'M' for Megabytes (units of 1048576 bytes)
    #按照MB单位搜索,必须是大写的M
    'G' for Gigabytes (units of 1073741824 bytes)
    #按照GB单位搜索,必须是大写的G
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    如果我们想搜索大于 10KB 的文件,可以使用如下指令:

    当然我们也可以搜索一个区间里的文件,比如[10M, 100M]:


    按照修改时间搜索

    Linux 中的文件有访问时间(atime)、数据修改时间(mtime)、状态修改时间(ctime)这三个时间,我们也可以按照时间来搜索文件。

    选项:

    • atime [+-]时间:按照文件访问时间搜索;

    • mtime [+-]时间:按照文件数据修改时间搜索;

    • ctime [+-]时间:按照文件状态修改时间搜索。

    • -5:代表5天内修改的文件;

    • 5:代表前5~6天那一天修改的文件;

    • +5:代表6天前修改的文件。

    下面用一个时间轴解释一下:

    按照权限搜索

    选项:

    • -perm 权限模式:查找文件权限刚好等于权限模式的文件;
    • -perm -权限模式: 查找文件权限全部包含权限模式的文件;
    • -perm +权限模式:查找文件权限包含权限模式的任意一个权限的文件。

    为了便于理解,我们要举几个例子。先建立几个测试文件:

    [root@localhost ~]# mkdir test
    [root@localhost ~]# cd test/
    [root@localhost test]# touch testl
    [root@localhost test]# touch test2
    [root@localhost test]# touch test3
    [root@localhost test]# touch test4
    #建立测试目录,以及测试文件
    [root@localhost test]# chmod 755 testl
    [root@localhost test]# chmod 444 test2
    [root@localhost test]# chmod 600 test3
    [root@localhost test]# chmod 200 test4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. -perm 权限模式,这种搜索查找的权限必须和指定的权限模式一模一样,才可以找到:
    [root@localhost test]#find . -perm 444
    ./test2
    [root@localhost test]#find . -perm 200
    ./test4
    #按照指定权限搜索文件,文件的权限必须和搜索指定的权限一致,才能找到
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. -perm -权限模式,代表文件的权限必须全部包含搜索命令指定的权限模式,才可以找到:
    [root@localhost test]#find . -perm -200
    ./test4 <-此文件权限为200
    ./test3 <-此文件权限为600
    ./testl <-此文件权限为755
    #搜索文件的权限包含200的文件,不会找到test2文件,因为test2的权限为444,不包含200权限
    
    • 1
    • 2
    • 3
    • 4
    • 5

    因为 test4 的权限 200(-w-------)、test3 的权限 600(-rw-------)和 test1 的权限 755(-rwxr-xr-x) 都包含 200(–w-------) 权限,所以可以找到;而 test2 的权限是 444 (-r–r–r–),不包含 200 (–w-------)权限,所以找不到,再试试:

    [root@localhost test]# find .-perm -444
    .
    ./test2 <-此文件权限为444
    ./test1 <-此文件权限为755
    #搜索文件的权限包含444的文件
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上述搜索会找到 test1 和 test2,因为 test1 的权限 755 (-rwxr-xr-x)和 test2 的权限 444 (-r–r–r–)都完全包含 444 (-r–r–r–)权限,所以可以找到;而 test3 的权限 600 (-rw-------)和 test4 的权限 200 (-w-------)不完全包含 444 (-r–r–r–) 权限,所以找不到。也就是说,test3 和 test4 文件的所有者权限虽然包含 4 权限,但是所属组权限和其他人权限都是 0,不包含 4 权限,所以找不到,这也是完全包含的意义。

    1. -perm +权限模式,只要包含任意一个指定权限,就可以找到:
    [root@localhost test]# find . -perm +444
    ./test4 <-此文件权限为200
    ./test3 <-此文件权限为600
    ./testl <-此文件权限为755
    #搜索文件的权限包含200的文件,不会找到test2文件,因为test2的权限为444,不包含200权限。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    因为 test4 的权限 200 (–w-------)、test3 的权限 600 (-rw-------)和 test1 的权限 755 (-rwxr-xr-x)都包含 200(–w-------)权限,所以可以找到;而 test2 的权限是 444 (-r–r–r–),不包含 200 (–w-------)权限,所以找不到。


    按照所有者和所属组搜索

    选项:

    • -uid 用户 ID:按照用户 ID 査找所有者是指定 ID 的文件;
    • -gid 组 ID::按照用户组 ID 査找所属组是指定 ID 的文件;
    • -user 用户名:按照用户名査找所有者是指定用户的文件;
    • -group 组名:按照组名査找所属组是指定用户组的文件;
    • nouser:査找没有所有者的文件。

    这组选项比较简单,就是按照文件的所有者和所属组来进行文件的査找。在 Linux 系统中,绝大多数文件都是使用 root 用户身份建立的,所以在默认情况下,绝大多数系统文件的所有者都是 root。例如:

    [root@localhost ~]#find . -user root
    #在当前目录中査找所有者是 root 的文件
    
    • 1
    • 2

    由于当前目录是 root 的家目录,所有文件的所有者都是 root 用户,所以这条搜索命令会找到当前目录下所有的文件。

    按照所有者和所属组搜索时,-nouser 选项比较常用,主要用于査找垃圾文件。在 Linux 中,所有的文件都有所有者,只有一种情况例外,那就是外来文件。比如光盘和 U 盘中的文件如果是由 Windows 复制的,在 Linux 中査看就是没有所有者的文件;再比如手工源码包安装的文件,也有可能没有所有者。

    除这种外来文件外,如果系统中发现了没有所有者的文件,一般是没有作用的垃圾文件(比如用户删除之后遗留的文件),这时需要用户手工处理。搜索没有所有者的文件,可以执行以下命令:

    [root@localhost ~]# find/-nouser
    
    • 1

    按照文件类型搜索

    选项:-type 文件类型,Linux 有如下文件类型:

    比如搜索家目录下的管道文件:


    逻辑运算符

    选项:

    • -a:and逻辑与;
    • -o:or逻辑或;
    • -not:not逻辑非。

    下面分类进行说明:

    1. -a:and逻辑与

    find 命令也支持逻辑运算符选项,其中 -a 代表逻辑与运算,也就是 -a 的两个条件都成立,find 搜索的结果才成立。

    举个例子:

    [root@localhost ~]# find.-size +2k -a -type f
    #在当前目录下搜索大于2KB,并且文件类型是普通文件的文件
    
    在这个例子中,文件既要大于 2KB,又必须是普通文件,find 命令才可以找到。再举个例子:
    [root@localhost ~]# find.-mtime -3 -a -perm 644
    #在当前目录下搜索3天以内修改过,并且权限是644的文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. -o:or逻辑或

    -o 选项代表逻辑或运算,也就是 -o 的两个条件只要其中一个成立,find 命令就可以找到结果。例如:

    [root@localhost ~]#find.-name cangls -o -name bols
    ./cangls
    ./bols
    #在当前目录下搜索文件名要么是cangls的文件,要么是bols的文件
    
    • 1
    • 2
    • 3
    • 4

    -o 选项的两个条件只要成立一个,find 命令就可以找到结果,所以这个命令既可以找到 cangls 文件,也可以找到 bols 文件。

    1. -not:not逻辑非

    -not是逻辑非,也就是取反的意思。举个例子:

    [root@localhost ~]# find.-not -name cangls
    #在当前目录下搜索文件名不是cangls的文件
    
    • 1
    • 2

    其他选项

    1. -exec选项

    这里我们主要讲解两个选项 -exec-ok,这两个选项的基本作用非常相似。我们先来看看 exec 选项的格式。

    [root@localhost ~]# find 搜索路径 [选项] 搜索内容 -exec 命令2{}\;
    
    • 1

    首先,请大家注意这里的 {}\; 是标准格式,只要执行 -exec 选项,这两个符号必须完整输入。

    其次,这个选项的作用其实是把 find 命令的结果交给由 -exec 调用的 命令 2 来处理。{} 就代表 find 命令的査找结果。

    我们举个例子,刚刚在讲权限的时候,使用权限模式搜索只能看到文件名,例如:

    [root@localhost test]#find.-perm 444
    ./test2
    
    • 1
    • 2

    如果要看文件的具体权限,还要用 ll 命令査看。用 -exec 选项则可以一条命令搞定:

    [root@localhost test]# find.-perm 444 -exec ls -l {}\;
    -r--r--r-- 1 root root 0 617 11:05 ./test2
    #使用"-exec"选项,把find命令的结果直接交给"ls -l"命令处理
    
    • 1
    • 2
    • 3

    -exec 选项的作用是把 find 命令的结果放入{} 中,再由命令 2 直接处理。在这个例子中就是用 ls -l 命令直接处理,会使 find 命令更加方便。

    1. -ok 选项
      -ok 选项和 -exec 选项的作用基本一致,区别在 -exec 的命令会直接处理,而不询问;-ok 的命令 2 在处理前会先询问用户是否这样处理,在得到确认命令后,才会执行。例如:
    [root@localhost test]# find .-perm 444 -ok rm -rf{}\;
    <rm…./test2>?y  <-需要用户输入y,才会执行
    #我们这次使用rm命令来删除find找到的结果,删除的动作最好确认一下
    
    • 1
    • 2
    • 3

    文件的检索

    Linux中文件的检索主要使用 grep 命令,其用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。如不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

    其语法如下:

    grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
    
    • 1

    下面主要针对几个常用的进行说明:

    在当前目录查找

    在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:

    grep “test” *file 
    
    • 1

    结果如下所示:

    $ grep “test” test* #查找前缀有“test”的文件包含“test”字符串的文件  
    testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行  
    testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行  
    testfile_2:Linux test #列出testfile_2 文件中包含test字符的行 
    
    • 1
    • 2
    • 3
    • 4

    递归查找

    前面不带任何选项是不会对子目录进行查找的,通过选项 -r 来对子目录递归查找:

    grep -r “update” /etc/acpi 
    
    • 1

    输出结果如下:

    $ grep -r “update” /etc/acpi #以递归的方式查找“etc/acpi”  
    #下包含“update”的文件  
    /etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.)  
    Rather than  
    /etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of  
    IO.) Rather than  
    /etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    反向查找

    前面的例子是查找并打印符合条件的行,通过 -v 参数可以打印不符合条件行的内容。

    比如查找文件名包含 test 的文件中不包含 test 的行,使用的命令为:

    grep -v "test" *test*
    
    • 1

    结果如下所示:

    $ grep -v "test" *test* #查找文件名中包含test 的文件中不包含test的行  
    testfile1:helLinux!  
    testfile1:Linis a free Unix-type operating system.  
    testfile1:Lin  
    testfile_1:HELLO LINUX!  
    testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.  
    testfile_1:THIS IS A LINUX TESTFILE!  
    testfile_2:HELLO LINUX!  
    testfile_2:Linux is a free unix-type opterating system.  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    进阶指针(四)—— 加强对指针,数组名,sizeof,strlen的理解
    贪心算法java实现
    【示波器专题】示波器触发电路原理
    使用YOLOv5的backbone网络识别图像天气 - P9
    【Linux学习】03Linux用户和权限
    零基础入门低代码后端开发,只需几行代码就可以操作数据库
    Windows10安装配置Docker客户端和WSL2与Hyper-V虚拟机
    Spring AOP如何基于AspectJ XML开发呢?
    【conda】——pack打包32位python,在服务器报 no such file
    OCR 02
  • 原文地址:https://blog.csdn.net/weixin_44491423/article/details/126430402