文件的查找
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
-perm 权限模式
,这种搜索查找的权限必须和指定的权限模式一模一样,才可以找到:
[root@localhost test]#find . -perm 444
./test2
[root@localhost test]#find . -perm 200
./test4
#按照指定权限搜索文件,文件的权限必须和搜索指定的权限一致,才能找到
-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 权限,所以找不到,这也是完全包含的意义。
-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逻辑非。
下面分类进行说明:
- -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的文件
- -o:or逻辑或
-o
选项代表逻辑或运算,也就是 -o
的两个条件只要其中一个成立,find
命令就可以找到结果。例如:
[root@localhost ~]#find.-name cangls -o -name bols
./cangls
./bols
#在当前目录下搜索文件名要么是cangls的文件,要么是bols的文件
-o
选项的两个条件只要成立一个,find 命令就可以找到结果,所以这个命令既可以找到 cangls 文件,也可以找到 bols 文件。
- -not:not逻辑非
-not是逻辑非,也就是取反的意思。举个例子:
[root@localhost ~]# find.-not -name cangls
#在当前目录下搜索文件名不是cangls的文件
其他选项
- -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 6月 17 11:05 ./test2
#使用"-exec"选项,把find命令的结果直接交给"ls -l"命令处理
-exec
选项的作用是把 find
命令的结果放入{}
中,再由命令 2 直接处理。在这个例子中就是用 ls -l
命令直接处理,会使 find
命令更加方便。
- -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.