不管在Windows还是Linux中,最重要的问题不是说你能搜索到这个文件,而是最好少用搜索,应该是你在整个服务器的规划里面,把所以的文件目录规划的很好。就像如果你在家里找衣服,如果不是你乱扔,就不可能花费太长的时间。因为搜索会占用大量的系统资源,但是有一些操作比如被他人非法修改的文件,的确find命令是一个很好的选择。
文件搜索命令find的一般格式
find path -option [-print] [-exec -ok command] {} \;
path:find命令所要查找的目录路径,比如/root,表示在root目录下搜索匹配。
-print:find命令将匹配的文件输出到标准输出。
-exec:find命令对匹配的文件执行该参数所给出的shell命令。
-ok:和exec作用相同,只不过以一种更为安全的模式来执行该参数给出的shell命令,在执行每一个命令执行都会提示是否确认执行。
1
2
3
4
5
6
7
8
9
findpath-option[-print][-exec-okcommand]{}\;
path:find命令所要查找的目录路径,比如/root,表示在root目录下搜索匹配。
-print:find命令将匹配的文件输出到标准输出。
-exec:find命令对匹配的文件执行该参数所给出的shell命令。
-ok:和exec作用相同,只不过以一种更为安全的模式来执行该参数给出的shell命令,在执行每一个命令执行都会提示是否确认执行。
find一般搜索使用实例
在目录/etc中查找文件init
find /etc -name init
1
2
3
在目录/etc中查找文件init
find/etc-nameinit
大家可能会认为只要文件名包含init,比如initab,123init都会被匹配到,linux不同于windows,linux中的搜索就是精准搜索,也就是说,只有文件名为init的文件才可以搜索到。那么如果linux下我想搜索文件名包含init的文件怎么办呢?
find /etc -name *init*
只要文件名里面包含init都会被例举出来
* :表示匹配一个字符串
1
2
3
4
5
find/etc-name *init*
只要文件名里面包含init都会被例举出来
*:表示匹配一个字符串
find /etc -name init*
表示在etc目录中匹配文件名以init开头的文件
1
2
3
find/etc-nameinit*
表示在etc目录中匹配文件名以init开头的文件
find /etc -name init???
在etc目录下搜索文件名以init开头后面跟3个字符的文件
?:匹配单个字符
1
2
3
4
5
find/etc-nameinit???
在etc目录下搜索文件名以init开头后面跟3个字符的文件
?:匹配单个字符
iname:表示不区分大小写
1
iname:表示不区分大小写
在根目录下查找大于100MB的文件
find / +size +204800
1
2
3
在根目录下查找大于100MB的文件
find/+size+204800
在linux当中,一个数据块是512字节,即0.5K,文件的大小以数据块来计算,因此100MB=102400KB=204800。数据块是linux文件中存储的最小单位。+n:大于,-n:小于,n:等于。
普通用户家目录下查找所有者为wenyang的文件
find / -user wenyang
1
2
3
普通用户家目录下查找所有者为wenyang的文件
find/-userwenyang
user表示根据所有者查找,当然,我们也可以使用-group根据所属组来搜索。
通过时间属性来搜索
-amin:访问时间 access
-cmin:文件属性 change
-mmin:文件内容 modify
上述三种以分钟为单位
1
2
3
4
5
6
7
-amin:访问时间access
-cmin:文件属性change
-mmin:文件内容modify
上述三种以分钟为单位
-atime:访问时间 access
-ctime:文件属性 change
-mtime:文件内容 modify
上述三种以天为单位
1
2
3
4
5
6
7
-atime:访问时间access
-ctime:文件属性change
-mtime:文件内容modify
上述三种以天为单位
我习惯性把上述的3个时间属性称为ACM,在这里我附上前面一篇关于ACM的博文方便大家记忆:https://www.1024do.com/?p=2318。
在home目录下查找10分钟内被修改过属性的文件和目录
find /home -cmin -10
1
2
3
在home目录下查找10分钟内被修改过属性的文件和目录
find/home-cmin-10
-10表示10分钟之内,+10代表的就是10分钟以前。其他时间属性的操作与此一致。
find中的多条件命令
在/home下寻找大于2MB小于4MB的文件
find /home -size +2048 -a -size -8192
1
2
3
在/home下寻找大于2MB小于4MB的文件
find/home-size+2048-a-size-8192
-a在这里表示两个条件同时满足,与之对应的还有-o,表示两个条件满足任意一个即可。
在/etc下查找inittab文件并显示其详细信息
find /etc -name inittab -exec ls -l {} \;
1
2
3
在/etc下查找inittab文件并显示其详细信息
find/etc-nameinittab-execls-l{}\;
-exec在这里起一个链接作用,与-ok的区别在于,它不需要确认,而-ok会进行安全检查。ls -l表示显示文件信息,{}表示对find查询的结果替换,\表示转义符,;表示结束。
通过文件类型搜索
-type 根据文件类型查找
f:文件
d:目录
l:软链接文件
1
2
3
4
-type根据文件类型查找
f:文件
d:目录
l:软链接文件
在etc目录下寻找以init开头的并且是文件类型的文件
find /etc -name init* -a -type f
1
2
3
在etc目录下寻找以init开头的并且是文件类型的文件
find/etc-nameinit*-a-typef
在etc目录下寻找以init开头的目录
find /etc -name init* -a -type d
1
2
3
在etc目录下寻找以init开头的目录
find/etc-nameinit*-a-typed
在etc目录下寻找以init开头的软链接
find /etc -name init* -a -type l
1
2
3
在etc目录下寻找以init开头的软链接
find/etc-nameinit*-a-typel
根据i节点查找
即inum,每个文件或目录都有一个i节点,这里不详细描述,只简单介绍一下其用法,具体情况大家可以自行百度,我们可以通过寻找一个文件、目录的inum节点而对其进行其他操作。
搜索home目录下删除i节点为127的目录
find /home -inum 127 -exec rm -rf {} \;
1
2
3
搜索home目录下删除i节点为127的目录
find/home-inum127-execrm-rf{}\;
从图中可以看出,通过查看文件或目录的i节点,就可以对其进行附加的操作。
总结:find命令可以精准的搜索到你的预期要求,当其他命令不能搜索到某个文件或目录时,find确实给我们带来了很多便捷,但是,find命令在搜索的时候是从硬盘进行遍历的,因此会非常耗费硬盘的资源,这样就会使搜索时间提高,随之而来的就是效率的低下,所以说,find是一把双刃剑,带给我们便捷的途中,也难免让我们耗费更多的资源与时间。