我们知道,Linux下find命令可以在目录中搜索指定文件,并进行相应的操作。find命令提供了相
当强大的查找条件,功能很强大。所以今天我们来分析一下find的用法。与which和whereis不同的是
find在查找文件的时候是真正的在遍历所有的文件,如果find没有找到你所需要的目标的话,那系统中
一定不存在你所需要的文件,因此find在使用的时候会比其他的查找指令更详尽一些,当我们在运行一
个很消耗资源的find指令的时候,人们倾向于将其放在后台运行,因为遍历一个大的文件系统可能需要
很长时间。
命令格式
find pathname -options[-print -exe -ok ...]
命令功能
在文件树中查找文件,并进行相应操作(可能访问磁盘)。
命令参数
pathname:find命令查找的搜索路径,例如用.来表示当前目录,/表示根目录
-print:将查找后匹配的文件 并将其输出到标准输出上
-exe:查找一个匹配文件并执行该参数给出的shell命令,相应的命令形式为‘command’{ } \ ;注意{ }和\之间的空格
-ok:与-exe的作用相同,只不过以一种更安全的模式来执行,每次执行命令之前否会询问,让用户选择是否要执行
命令选项
-name:按照文件名来查找
-perm:按照文件权限来查找
-prune:使用这一选项可以使find不在当前指定的目录中查找
-user:按照文件所属用户来查找
-group:按照文件所述用户组来查找
-mtime -n/+n:按照文件的修改时间来查找,-n表示文件修改时间距离现在n天以内,+n表示文件修改时间距离现在n天以外,find命令里面还有-atime,-ctime,作用都与-mtime
-nogroup:查找无效所属组的文件,即该文件在etc/group中不存在
-nouser:查找无效所属用户的文件,即该文件在etc/passwd中不存在
-newer file1 !file2:查找修改时间比file1新但是比file2旧的文件
-type:按照文件类型来查找:
b-块设备文件
c-字符设备文件
d-目录文件
l-符号链接文件
f-普通文件
p-管道文件
-size [n]:[c] 查找文件大小为n块的文件,带有c时表示文件大小以字节计
-depth:表示查找文件时,先在当前目录中查找,再在当前目录的子目录中查找
(1)按照-name来查找
①、不管当前的搜索路径是什么,当我们要在自己的根目录下来搜索某个文件,可以用~来代表整个根目录,下面来看个栗子:
其中find ~ -name “fuxin” -print 这一条命令是按照文件名来搜索文件名为fuxin的文件,并将
②、当我们在当前目录及其子目录下搜索目标文件的时候,我们可以用.来代替当前目录,如下:
其输出,注意这里的文件名要用双引号。
③、当我们想在当前目录中寻找一个文件名以小写字母开头的文件,可以用
ind . -name "[a-z]*" -print,示例如下:
同理大写字母只需要将a-z改成A-Z就可以了
④、当我们想在查找home目录中的文件,可以用:
find ~ -name "*" -print 或find . -print ,示例如下:
由于文件太多我这里只截了一部分,剩下的大家可以自己操作试试。
(2)按照-perm来查找
写在前面:我们知道一个文件的权限管理有三类人:user,gorup,other,执行事件的属性有读,写,执行,三类,如果一类人用一位八进制来表示的话,我们可以用三位八进制数来表示一个文件的权限。举个例子先~
如上图所示,对于文件fuxin来说,对于user来说的权限为读写操作,对应的八进制为7,而对于group来说读写操作,对应的八进制为7,对于other来说权限为读操作,对应的八进制为5,所以文件fuxin的权限为775,这样的方式表示一个文件的权限就很方便了。
①、如果在当前目录下查找权限为XXX的文件,可以用:
find . -perm XXX -print,例子如下:
当我们要查找一个文件的三类人的权限是一样的文件时,例如777,可以讲八进制前面加一个杠,如-007,表示777,示例如下:
(3)如何在查找一个文件的时候避开某个目录?
例如:在目录dir1下查找不在目录dir2下的文件
find test -path "dirt/dir2" -prune -o -print
说明:
find [-path ..] [expression]
在路径列表的后面的是表达式
-path "test" -prune -o -print 是 -path "test" -a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果
-path "test" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "test" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。
这个表达式组合特例可以用伪码写为:
if -path "test" then
-prune
else
(4)使用-user和-nouser选项
①按文件所属主查找,-user
例:在home目录下查找所属主为user1的文件,可以用:
find ~ -user fuxin -print
这文件太多我只截了一部分,以实际操作为准。
同理如果在其他目录里查找一个文件,只需要将pathname改成其他路径就好了。
②、查找属主帐户已经被删除的文件,可以使用-nouser选项。
例:在/home目录下查找所有的这类文件,命令:find /home -nouser -print
(5)使用-group和-nogroup选项
①、与-user和-nouser一样,-group和-nogroup是针对文件所属组的,若要在home目录下查找用户组为fuxin的文件,命令:
find ~ -group fuxin -print
②、要在某个目录里查找无效所属组的文件可以用-nogroup,指令:
find pathname -nogroup -print
(6)使用-mtime -n +n选项
在系统根目录下查找距离今日1日时间的文件
find / -mtime -1 -print
(7)使用-newer file1! file2,查找某个比文件file1新且比file2旧 的文件
例如:在home中查找一个比test1新比test2旧的文件
find ~ -newer test1! test2 -print
(8)使用-type选项
在某个目录下查找文件类型为d的文件:
find ~ -type d -print
当查找不同类型的文件只需要改变文件类型就行了。
(9)-size选项,查找长度为n块的文件(1块等于512字节)
如果要在home下查找长度为10000字节的文件:
find ~ -size 10000c -print
如果要在home下查找长度为10000块的文件
find~ -size 10000 -print
(10)-depth选项
在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。
在根目录中查找一个文件名为file的文件
find / -name "file" -depth -print
以上便是find常见指令的用法啦,写了好久,希望大家能够为我指出不足之处共同进步,谢谢啦!