find命令小结
Linux有个独特的思想,一切皆文件。每个文件都用它的独特之处,如此多的文件构成了这个功能强大的系统。如此多的文件让我们很难一个个去查找,为了方便用户来查找文件,一些文件查找命令就横空出世了。下面给读者介绍一下文件查找的命令。
所谓的文件查找命令就是来查找文件的文件名,而不像grep,egrep等命令实现查找文件中某个匹配的内容。
文件查找的命令有许多,find就是我要介绍的主要命令,在讲解find前,我想讲解另一个命令。
locate命令:是在全系统上查找文件的,查找是根据全系统文件数据库进行的 非实时,模糊匹配查找的。
所谓非实时就是linux系统在特定的时间中系统自动统计所有的文件并存放在文件数据库中,假设这个特定的时间为0点,今天某个时间段创建了一个文件,而用户要在今天的这个时间来查找,用户是不可能查找到的,因为这个特定时间还没有过,此文件还没被存入文件数据库的,因此不会查到;必须在第二天来查找。
模糊查找,比如用户要查找文件名为passwd文件,用locate passwd命令会将所用文件名中含有passwd的字符串甚至路径中含有passwd的也都显示出来,而不是精确到文件名只为passwd的文件。
如图
而对我们来说,locate命令有许多不足之处,我们在进行文件查找是很少用到它,我们用的最多的就是find命令。
find命令能精确的找到我们要查找的命令,而且它能实时查找,通过遍历指定目录中的所有文件来完成查找,速度慢,支持众多查找标准。
find命令格式:
find 查找路径 查找标准 查找到以后的处理运作
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理运作:默认为显示
查找标准:
-name ‘文件名’:根据文件名查找,对文件名进行精确匹配
如:我们要查找目录ect下的文件passwd,则用命令find /etc -name ‘passwd’
如图
find的命令还可以与通配符连用
如通配符 *:表示任意长度的任意字符
在etc下查找以passwd结尾的文件,命令如find /etc -name ’*passwd‘如图:
有3个符合的,比上一条命令多了一个opasswd
-iname ‘文件名’:文件名匹配查找时不区分大小写
为了能讲清楚,我在家目录下创建了两个文件a和A,用命令
find ./ -iname ’a‘结果如下:
-regex 正则表达式:基于正则表达式来进行文件名匹配查找
-user USERNAME:根据属主查找
我事先在/tmp/test创建了一些文件,我们来查找属主为user1的文件,用命令find /tmp/test -user user1
-group GROUPNAME:根据属组查找,此用法和查找属主的用法一样,不在详细说明
-uid UID:根据UID查找
有的文件属主不存可以根据UID来查找文件,在上一个例子中我们把user1删除,那么/tmp/test/cups文件的属主就不存在了,我们如何查找这个文件呢?用UID来查找,cpus文件UID为2008,我们用命令find /tmp/test -uid 2008
-gid GID:根据GID查找 (用法同上,不在详细说明)
-nouser:查找没有属主的文件
刚才我们将文件cpus的属主给删掉了,那么我们用这个命令就能查找到cpus文件,如图
-nogroup:查找没有属组的文件(同上)
根据文件类型查找
-type
f:普通文件
d:目录文件
b:块设备文件
c:字符设备文件
l:符号链接文件
p:命令管道文件
我们在查找目录文件可以用这个命令,find /tmp -type d
-size (#为数字)
#k:表示精确几k的文件(有误差,但很小)或[+|-]k:+k表示大于k的,-k表示小于k的 但我们精确到1k或1M是,则表示所有小于或等于1K的文件,1M也是如此
#M:使用方法和k一样
#G:(同上)
我们在查找10K的文件,可以用命令find /tmp -size 10k
查找文件大于10k的文件,命令为find /tmp -size +10k
由于tmp文件小于10k的太多所以我们查找文件小于2k的文件,find /tmp -size -2k
其他的命令用法相同。
组合条件
-a:与 (与的优先级大于或的) -o:或 -not:非
比如我们来查找一个没有属主的文件并且是普通文件的文件,想想我们能查找到哪个文件,用find /tmp -nouser -a -type f
查找的结果就是cups文件,在nouser命令时我们把它的属主删了,而f有为普通文件,这个结果是没错的。
-mtime #:表示的是在#天内被修改了的文件
-ctime #:表示的是在#天内被改变了的文件
-atime #:表示的是在#天内被访问了的文件
查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
find /etc -mtime -7 -not \ ( -user root -o -user student \)
find /etc -mtime -7 -not -user root -a -not -user student
-mmin #:表示的是在#分钟内被修改了的文件
-cmin #:表示的是在#分钟内被改变了的文件
-amin #:表示的是在#分钟内被访问了的文件
根据权限来查找
-perm mode:精确匹配,即每一位权限都与定义的权限要完全匹配
-perm -mode:(权限如755,644)表示文件权限能完全包含此MODE的才能显示
-perm \ mode: 表示任意一位权限匹配即满足条件
如我们来查找权限为775的文件
find /tmp -perm 644
处理动作:
-print:显示
-ls:跟ls -l命令相似,显示每一个文件的详细信息
-ok COMMAND {} \;(分号不可少):每一次操作都需要用户确认
-exec COMMAND {} \; :不需要确认
如查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
find /etc -not -perm /222 -ls
看到这有的读者就要迷惑了,-perm /mode 不是表示任意一位权限匹配即满足条件吗?为何这里把所有用户没有写权限的文件都显示了,其实很简单,-perm /222表示只要有一位权限是写入权限,则显示出来,而我们在这个-perm /222 取个反值,就表示相反的意义了,表示为都没有写入权限的显示。
如查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;