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