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

文件的查找

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

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

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

如果我们想搜索大于 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. -perm 权限模式,这种搜索查找的权限必须和指定的权限模式一模一样,才可以找到:
[root@localhost test]#find . -perm 444
./test2
[root@localhost test]#find . -perm 200
./test4
#按照指定权限搜索文件,文件的权限必须和搜索指定的权限一致,才能找到
  1. -perm -权限模式,代表文件的权限必须全部包含搜索命令指定的权限模式,才可以找到:
[root@localhost test]#find . -perm -200
./test4 <-此文件权限为200
./test3 <-此文件权限为600
./testl <-此文件权限为755
#搜索文件的权限包含200的文件,不会找到test2文件,因为test2的权限为444,不包含200权限

因为 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的文件

上述搜索会找到 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权限。

因为 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 的文件

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

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

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

[root@localhost ~]# find/-nouser

按照文件类型搜索

选项:-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. -o:or逻辑或

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

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

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

  1. -not:not逻辑非

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

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

其他选项

  1. -exec选项

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

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

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

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

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

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

如果要看文件的具体权限,还要用 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"命令处理

-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找到的结果,删除的动作最好确认一下

文件的检索

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

其语法如下:

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

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

在当前目录查找

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

grep “test” *file 

结果如下所示:

$ 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字符的行 

递归查找

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

grep -r “update” /etc/acpi 

输出结果如下:

$ 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 

反向查找

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

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

grep -v "test" *test*

结果如下所示:

$ 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值