(Linux基础学习)Linux中强大的搜索命令-LICENSE
查找当前目录以及子目录下文件名为LICENSE的命令
find.-nameLICENSE
find是Linux中强悍的搜索命令,除了可以根据文件名搜索文件,还可以根据权限、大小、时间、inode号等来搜索文件。并且find命令是直接在硬碟中进行搜索的,倘若指定的搜索范围过大,find命令都会消耗较大的系统资源,造成服务器压力过大。所以,在使用find命令搜索时,不要指定过大的搜索范围。
find命令的基本信息如下:
命令名称:find。
中文本意:searchforfilesinadirectoryhierarchy.
所在路径:/bin/find。
执行权限:所有用户。
功能描述:在目录中查找文件。
命令格式
[root@linuxcool~]#find搜索路径[选项]搜索内容
find是比较特殊的命令,它有两个参数:
第一个参数拿来指定搜索路径;
第二个参数拿来指定搜索内容。
但是find命令的选项比较复杂,我们一个一个举例来看。
根据文件名搜索
[root@linuxcool~]#find搜索路径[选项]搜索内容
选项:
-name:根据文件名搜索;
-iname:根据文件名搜索,不分辨文件名大小;
-inum:根据inode号搜索;
这是find最常用的用法,我们来试试:
[root@linuxcool~]#find/-nameyum.conf
/etc/yum.conf
#在目录下査找文件名是yum.conf的文件
然而find命令有一个小特点,就是搜索的文件名必须和你的搜索内容一致就能找到。若果只包含搜索内容,则不会找到。我们做一个实验:
[root@linuxcool~]#touchyum.conf.bak
#在/root/目录下构建一个文件yum.conf.bak
[root@linuxcool~]#find/-nameyum.conf
/etc/yum.conf
#搜索只能找到yum.conf文件,而不能找到yum.conf.bak文件
find才能找到的是只有和搜索内容yum.conf一致的/etc/yum.conf文件,而/root/yum.conf.bak文件尽管富含搜索关键字,而且不会被找到。这些特点我们总结为:find命令是完全匹配的,必须和搜索关键字一模一样才能列举。
Linux中的文件名是分辨大小写的,也就是说,搜索大写文件,是找不到小写文件的。假如想要大小通吃,就要使用-iname来搜索文件。
[root@linuxcool~]#touchCANGLS
[root@linuxcool~]#touchcangls
#构建小写和大写文件
[root@linuxcool~]#find.-inamecangls
./CANGLS
./cangls
#使用-iname,大小写文件通吃
每位文件都有inode号,假如我们晓得inode号,则也可以根据inode号来搜索文件。
[root@linuxcool~]#ls-iinstall.log
262147install.log
#假如晓得文件名,则可以用”ls-i”来査找inode号
[root@linuxcool~]#find.-inum262147
./install.log
#假如晓得inode号,则可以用find命令来査找文件
根据inode号搜索文件,也是分辨硬链接文件的重要手段,由于硬链接文件的inode号是一致的。
[root@linuxcool~]#ln/root/install.log/tmp/
#给install.log文件创建一个硬链接文件
[root@linuxcool~]#ll-i/root/install.log/tmp/install.log
262147-rw-r--r--.2rootroot247721月142014/root/
install.log
262147-rw-r--r--.2rootroot247721月142014/tmp/
install.log
#可以看见这两个硬链接文件的inode号是一致的
[root@linuxcool~]#find/-inum262147
/root/install.log
/tmp/install.log
#假如硬链接不是我们自己完善的,则可以通过find命令搜索inode号linux软件工程师,来确定硬链接文件
根据文件大小搜索
[root@linuxcool~]#find搜索路径[选项]搜索内容
选项:
-size[+-]大小:根据指定大小搜索文件
这儿的”+”的意思是搜索比指定大小还要大的文件,”-“的意思是搜索比指定大小还要小的文件。我们来试试:
[root@linuxcool~]#ll-hinstall.log
-rw-r--r--.1rootroot25K1月142014install.log#在当前目录下有一个大小是25KB的文件
[root@linuxcool~]#
[root@linuxcool~]#find.-size25k
./install.log
#当前目录下,査找大小恰好是25KB的文件,可以找到
[root@linuxcool~]#find.-size-25k
.
./.bashrc
./.viminfo
./.tcshrc
./.pearrc
./anaconda-ks.cfg
./test2
./.ssh
./.bash_history
./.lesshst
./.bash_profile
./yum.conf.bak
./.bashjogout
./install.log.syslog
./.cshrc
./cangls
#搜索大于25KB的文件,可以找到好多文件
[root@linuxcool~]#find.-size+25k
#而当前目录下没有小于25KB的文件
虽然find命令的-size选项是笔者个人感觉比较难受的选项,为何这样说?find命令可以根据KB来搜索,应当也可以根据MB来搜索吧。
[root@linuxcool~]#find.-size-25m
find:无效的-size类型”m”
#为何会报错呢?虽然是由于假如依照MB来搜索,则必须是小写的M
这就是纠结点,千字节必须是大写的”k”,而兆字节必领是小写的”M”。有些人会说:”你别这么执著啊,你就不能不写单位,直接根据字节搜索啊?”很傻,很天真,不写单位,大家就以为会根据字节搜索吗?我们来试试:
[root@linuxcool~]#llanaconda-ks.cfg
-rw——-.1rootroot12071月142014anaconda-ks.cfg
#anaconda-ks.cfg文件有1207字芳
[root@linuxcool~]#find.-size1207
#但用find查找1207,是哪些也找不到的
也就是说,find命令的默认单位不是字节。若果不写单位,这么find命令是根据512Byte来进行査找的。我们瞧瞧find命令的帮助。
[root@linuxcool~]#manfind
-sizen[cwbkMG]
Fileusesnunitsofspace.Thefollowingsuffixescanbeused:
'b'for512-byteblocks(thisisthedefaultifnosuffixisused)
#这是默认单位,假如单位为b或不写单位,则根据512Byte搜索
'c'forbytes
#搜索单位是c,根据字节搜索
'w'fortwo-bytewords
#搜索单位是w,根据双字节(英文)搜索
'k'forKilobytes(unitsof1024bytes)
#根据KB单位搜索,必须是大写的k
'M'forMegabytes(unitsof1048576bytes)
#根据MB单位搜索,必须是小写的M
'G'forGigabytes(unitsof1073741824bytes)
#根据GB单位搜索,必须是小写的G
也就是说,假如想要根据字节搜索,则须要加搜索单位”c”。我们来试试:
[root@linuxcool~]#find.-size1207c
./anaconda-ks.cfg
#使用搜索单位c,就会根据字节搜索
根据更改时间搜索
Linux中的文件有访问时间(atime)、数据更改时间(mtime)、状态更改时间(ctime)这三个时间,我们也可以根据时间来搜索文件。
[root@linuxcool~]#find搜索路径[选项]搜索内容
选项:
-atime[+-]时间:根据文件访问时间搜索
-mtime[+-]时间:根据文改时间搜索
-ctime[+-]时间:根据文件更改时间搜索
这三个时间的区别我们在stat命令中早已解释过了,这儿用mtime数据更改时间来举例,重点谈谈”[+-]”时间的含意。
-5:代表@内更改的文件。
5:代表前5~6天那三天更改的文件。
+5:代表6天前更改的文件。
我们画一个时间轴,来解释一下linux 中find查找在某两个范围之间的命令,如图1所示。
图1find时间轴
每次笔者提到这儿,”-5″代表5天内更改的文件,而”+5″总有人说代表5天更改的文件。要是笔者能晓得5天系统中能完善哪些文件,早就去买体彩了,那是难料先知啊!所以”-5″指的是5天内更改的文件,”5″指的是前5~6天那三天更改的文件,”+5″指的是6天前更改的文件。我们来试试:
[root@linuxcool~]#find.-mtime-5
#查找5天内更改的文件
你们可以在系统中把几个选项都试试,就可以明白各选项之间的差异了。
find除了可以根据atmie、mtime、ctime来査找文件的时间,也可以根据amin、mmin和cmin来査找文件的时间,区别只是所有time选项的默认单位是天,而min选项的默认单位是分钟。
根据权限搜索
在find中,也可以根据文件的权限来进行搜索。权限也支持[+/-]选项。我们先看一下命令格式。
[root@linuxcool~]#find搜索路径[选项]搜索内容
选项:
-perm权限模式:査找文件权限正好等于”权限模式”的文件
-perm-权限模式:査找文件权限全部包含”权限模式”的文件
-perm+权限模式:査找文件权限包含”权限模式”的任意一个权限的文件
为了易于理解,我们要举几个反例。先构建几个测试文件。
[root@linuxcool~]#mkdirtest
[root@linuxcool~]#cdtest/
[root@linuxcooltest]#touchtestl
[root@linuxcooltest]#touchtest2
[root@linuxcooltest]#touchtest3
[root@linuxcooltest]#touchtest4
#构建测试目录,以及测试文件
[root@linuxcooltest]#chmod755testl
[root@linuxcooltest]#chmod444test2
[root@linuxcooltest]#chmod600test3
[root@linuxcooltest]#chmod200test4
#设定实验权限。由于是实验权限,所以看上去比较别扭
[root@linuxcooltest]#ll
总药量0
-rwxr-xr-x1rootroot06月1711:05testl-r--r--r--1rootroot06月1711:05test2
-rw——-1rootroot06月1711:05test3
-w——-1rootroot06月1711:05test4
#查看权限
【例1】”-perm权限模式”。
这些搜索比较简单,代表査找的权限必须和指定的权限模式一模一样,才可以找到。
[root@linuxcooltest]#find.-perm444
./test2
[root@linuxcooltest]#find.-perm200
./test4
#根据指定权限搜索文件,文件的权限必须和搜索指定的权限一致,就能找到
【例2】”-perm-权限模式”。
假如使用”-权限模式”,是代表的是文件的权限必须全部包含搜索命令指定的权限模式,才可以找到。
[root@linuxcooltest]#find.-perm-200
./test4./test3./testl#搜索文件的权限包含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@linuxcooltest]#find.-perm-444
.
./test2./test1#搜索文件的权限包含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权限,所以找不到,这也是完全包含的意义。
【例3】”-perm+权限模式”
刚才的”-perm-权限模式”是必须完全包含,就能找到;而”-perm+权限模式”是只要包含任意一个指定权限,就可以找到。我们来试试:
[root@linuxcooltest]#find.-perm+444
./test4./test3./testl#搜索文件的权限包含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@linuxcool~]#find搜索路径[选项]搜索内容
选项:
-uid用户ID:根据用户ID査找所有者是指定ID的文件
-gid组ID:根据用户组ID査找所属组是指定ID的文件
-user用户名:根据用户名査找所有者是指定用户的文件
-group组名:根据组名査找所属组是指定用户组的文件
-nouser:査找没有所有者的文件
这组选项比较简单,就是根据文件的所有者和所属组来进行文件的査找。在Linux系统中,绝大多数文件都是使用root用户身分构建的,所以在默认情况下,绝大多数系统文件的所有者都是root。诸如:
[root@linuxcool~]#find.-userroot
#在当前目录中査找所有者是root的文件
因为当前目录是root的家目录,所有文件的所有者都是root用户,所以这条搜索命令会找到当前目录下所有的文件。
根据所有者和所属组搜索时,”-nouser”选项比较常用,主要用于査找垃圾文件。在Linux中,所有的文件都有所有者,只有一种情况例外,那就是外来文件。例如光碟和U盘中的文件假如是由Windows复制的,在Linux中査看就是没有所有者的文件;再例如手工源码包安装的文件,也有可能没有所有者。
除这些外来文件外,假如系统中发觉了没有所有者的文件linux 中find查找在某两个范围之间的命令linux移植,通常是没有作用的垃圾文件(例如用户删掉之后遗留的文件),这时须要用户手工处理。搜索没有所有者的文件,可以执行以下命令:
[root@linuxcool~]#find/-nouser
根据文件类型搜索
[root@linuxcool~]#find搜索路径[选项]搜索内容
选项:
-typed:查找目录
-typef:查找普通文件
-typel:查找软链接文件
这个命令也很简单,主要根据文件类型进行搜索。在一些特殊情况下,例如须要把普通文件和目录文件区分开,例如须要把普通文件和目录文件区分开,使用这个选项就很便捷。
[root@linuxcool~]#find/etc-typed
#查找/etc/目录下有什么子目录
逻辑运算符
[root@linuxcool~]#find搜索路径[选项]搜索内容
选项:
-a:and逻辑与
-o:or逻辑或
-not:not逻辑非
1)-a:and逻辑与
find命令也支持逻辑运算符选项,其中-a代表逻辑与运算,也就是-a的两个条件都组建,find搜索的结果才创立。
举个反例:
[root@linuxcool~]#find.-size+2k-a-typef
#在当前目录下搜索小于2KB,但是文件类型是普通文件的文件
在这个事例中,文件既要小于2KB,又必须是普通文件,find命令才可以找到。再举个反例:
[root@linuxcool~]#find.-mtime-3-a-perm644
#在当前目录下搜索3天以内更改过,但是权限是644的文件
2)-o:or逻辑或
-o选项代表逻辑或运算,也就是-o的两个条件只要其中一个创立,find命令就可以找到结果。诸如:
[root@linuxcool~]#find.-namecangls-o-namebols
./cangls
./bols
#在当前目录下搜索文件名要么是cangls的文件,要么是bols的文件
-o选项的两个条件只要创立一个,find命令就可以找到结果,所以这个命令既可以找到cangls文件,也可以找到bols文件。
3)-not:not逻辑非
-not是逻辑非,也就是取反的意思。举个反例:
[root@linuxcool~]#find.-not-namecangls
#在当前目录下搜索文件名不是cangls的文件
其他选项
1)-exec选项
这儿我们主要讲解两个选项”-exec”和”-ok”,这两个选项的基本作用十分相像。我们先来瞧瞧”exec”选项的格式。
[root@linuxcool~]#find搜索路径[选项]搜索内容-exec命令2{};
首先,请你们注意这儿的”{}”和”;”是标准格式,只要执行”-exec”选项,这两个符号必须完整输入。
其次,这个选项的作用似乎是把find命令的结果交给由”-exec”调用的命令2来处理。”{}”就代表find命令的査找结果。
我们举个事例,刚才在讲权限的时侯,使用权限模式搜索只能看见文件名,比如:
[root@linuxcooltest]#find.-perm444
./test2
假如要看文件的具体权限,还要用”ll”命令査看。用”-exec”选项则可以一条命令搞定:
[root@linuxcooltest]#find.-perm444-execls-l{};
-r--r--r--1rootroot06月1711:05./test2
#使用”-exec”选项,把find命令的结果直接交给”ls-l”命令处理
“-exec”选项的作用是把find命令的结果装入”{}”中,再由命令2直接处理。在这个事例中就是用”ls-l”命令直接处理,会使find命令愈加便捷。
2)-ok选项
“-ok”选项和”-exec”选项的作用基本一致,区别在于:”-exec”的命令会直接处理,而不寻问;”-ok”的命令2在处理前会先寻问用户是否这样处理,在得到确认命令后,才能执行。诸如:
[root@linuxcooltest]#find.-perm444-okrm-rf{};
?y#我们此次使用rm命令来删掉find找到的结果,删掉的动作最好确认一下