linux文件查找find命令
1、文件查找
基本介绍
在文件系统上查找符合条件的文件
linux上常见的文件查找工具:find命令
查找分类
实时查找
精确查找
基本语法
find [options..] [查找的路径] [查找条件] [处理动作]
查找的路径:指定查找目标文件具体路径。默认为当前目录
查找条件:指定的查找标准,可以是文件名、大小、类型、权限、属组或者属主等标准进行查找。默认为找出指定路径下的所有文件
处理动作:对查找符合的文件做什么操作。默认输出至屏幕
查找条件有哪些
根据文件名查找:
-name “文件名称”:文件名称支持使用glob,也就是可以是用*、?、[]、[^]。使用-name进行文件查找时,是严格区分文件大小写的
使用案例
[root@oldboy ~]# find /etc -name "fs*"
/etc/fstab
-iname “文件名称”:文件名称支持glob,使用-iname进行查找时,不区分文件的大小写
-regex PATTERN:以PATTERN去匹配整个路径字符串,而不仅仅是文件名称
根据文件的属组、属主查找
-user USERNAME:查找属主为USERNAME的文件
-group GROUPNAME:查找属组为GROUPNAME的文件
-uid UID:查找属主为指定UID号的文件
-gid GID:查找属组为指定GID号的文件
-nouser:查找没有属主的文件(即用户已经被删除,在文件属性中的属主列属性中只剩下一个UID)
-nogroup:查找没有属组的文件(即属组已经被删除,在文件属性中属组列属性只剩下一个GID)
注意:当我们把一个用户删除时,属于这个用户的文件的属组或者属主都变成相应的UID号了
根据文件类型查找
-type TYPE
TYPE包含下列几种
f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
p:管道文件
b:块设备文件
c:字符设备文件
组合条件查找
-a:与(可以省略)
-o:或
-not或者 ! :非
注意
组合条件查找时有时需要把组合条件执行了再执行处理动作,因此,这个是组合条件就需要加括号(括号需要转义)避免出错。因为组合条件可能和后边的处理动作产生歧义,造成意想不到的效果
产生这样结果的原因:通过处理动作执行后的结果会被输入到屏幕上,而组合条件没有加括号的话,只有组合条件中的最后一个条件与处理动作进行组和输出了
案例演示
[root@oldboy ~]# find /home -nouser -o -nogroup -ls -rw-r--r-- oldboy Jul /home/oldboy/.bash_profile -rw-r--r-- oldboy Jul /home/oldboy/.bashrc -rw-rw-r-- oldboy Mar /home/oldboy/.txt drw-r----- oldboy Mar /home/oldboy/test -rw------- oldboy Dec : /home/oldboy/.viminfo -rw------- oldboy Mar /home/oldboy/.bash_history -rw------- oldboy Mar /home/oldboy/.history -rw-r--r-- oldboy Jul /home/oldboy/.bash_logout drwxrwxr-x oldboy Dec : /home/oldboy/script -rw-rw-r-- oldboy Dec : /home/oldboy/script/functions [root@oldboy ~]# find /home -nouser -ls drwx------ Jan : /home/gentoo -rw-r--r-- Jul /home/gentoo/.bash_profile -rw-r--r-- Jul /home/gentoo/.bashrc -rw-r--r-- Jul /home/gentoo/.bash_logout drwx------ Mar : /home/com -rw-r--r-- Jul /home/com/.bash_profile drwxr-xr-x Mar /home/com/.mozilla drwxr-xr-x Aug /home/com/.mozilla/extensions drwxr-xr-x Aug /home/com/.mozilla/plugins -rw-r--r-- Jul /home/com/.bashrc -rw-r--r-- Jul /home/com/.bash_logout [root@oldboy ~]# find /home -nogroup -ls drwx------ Jan : /home/gentoo -rw-r--r-- Jul /home/gentoo/.bash_profile -rw-r--r-- Jul /home/gentoo/.bashrc -rw-r--r-- Jul /home/gentoo/.bash_logout -rw-r--r-- oldboy Jul /home/oldboy/.bash_profile -rw-r--r-- oldboy Jul /home/oldboy/.bashrc -rw-rw-r-- oldboy Mar /home/oldboy/.txt drw-r----- oldboy Mar /home/oldboy/test -rw------- oldboy Dec : /home/oldboy/.viminfo -rw------- oldboy Mar /home/oldboy/.bash_history -rw------- oldboy Mar /home/oldboy/.history -rw-r--r-- oldboy Jul /home/oldboy/.bash_logout drwxrwxr-x oldboy Dec : /home/oldboy/script -rw-rw-r-- oldboy Dec : /home/oldboy/script/functions drwx------ Mar : /home/com -rw-r--r-- Jul /home/com/.bash_profile drwxr-xr-x Mar /home/com/.mozilla drwxr-xr-x Aug /home/com/.mozilla/extensions drwxr-xr-x Aug /home/com/.mozilla/plugins -rw-r--r-- Jul /home/com/.bashrc -rw-r--r-- Jul /home/com/.bash_logout [root@oldboy ~]# find /home -nouser -o -nogroup /home/gentoo /home/gentoo/.bash_profile /home/gentoo/.bashrc /home/gentoo/.bash_logout /home/oldboy/.bash_profile /home/oldboy/.bashrc /home/oldboy/.txt /home/oldboy/test /home/oldboy/.viminfo /home/oldboy/.bash_history /home/oldboy/.history /home/oldboy/.bash_logout /home/oldboy/script /home/oldboy/script/functions /home/com /home/com/.bash_profile /home/com/.mozilla /home/com/.mozilla/extensions /home/com/.mozilla/plugins /home/com/.bashrc /home/com/.bash_logout [root@oldboy ~]# find /home \( -nouser -o -nogroup \) -ls drwx------ Jan : /home/gentoo -rw-r--r-- Jul /home/gentoo/.bash_profile -rw-r--r-- Jul /home/gentoo/.bashrc -rw-r--r-- Jul /home/gentoo/.bash_logout -rw-r--r-- oldboy Jul /home/oldboy/.bash_profile -rw-r--r-- oldboy Jul /home/oldboy/.bashrc -rw-rw-r-- oldboy Mar /home/oldboy/.txt drw-r----- oldboy Mar /home/oldboy/test -rw------- oldboy Dec : /home/oldboy/.viminfo -rw------- oldboy Mar /home/oldboy/.bash_history -rw------- oldboy Mar /home/oldboy/.history -rw-r--r-- oldboy Jul /home/oldboy/.bash_logout drwxrwxr-x oldboy Dec : /home/oldboy/script -rw-rw-r-- oldboy Dec : /home/oldboy/script/functions drwx------ Mar : /home/com -rw-r--r-- Jul /home/com/.bash_profile drwxr-xr-x Mar /home/com/.mozilla drwxr-xr-x Aug /home/com/.mozilla/extensions drwxr-xr-x Aug /home/com/.mozilla/plugins -rw-r--r-- Jul /home/com/.bashrc -rw-r--r-- Jul /home/com/.bash_logout
案例演示
找出/tmp目录下,属主不是root,并且文件的名字不是www的文件
find /tmp ! \( -user “root” -o -name “www” \) -ls
根据文件大小来查找
-size [+|-]num:指定文件的大小来进行查找。num表示文件的大小,后边可以跟一个单位,单位包括k、m、g
使用注意:
①当我们给定数字和单位,那么去找寻文件时表示查询的文件的大小范围在大于这个给定数字减一到这个给定数字之间的任何值
②如果使减号后面跟数字加单位,表示找寻的文件大小是从0开始到给定数字减一的所有文件
③如果使用加号后面跟数字加单位,表示去找寻的文件是从当前给定数字到无穷大之间的所有文件的大小
使用案例
查找/tmp目录下,大小是3k的文件
find /tmp -size 3k -type f
注意:这里打印出的文件可能并非大小只是3k的文件,包括大于2k,小于等于3k的文件
根据文件时间戳查找
以天为单位
-atime [+|-] num:查询访问时间
-mtime [+|-] num:查询修改时间
-ctime [+|-] num:查询文件属性改变时间
一分钟为单位
-amin [+|-] num:查询访问时间
-mmin [+|-] num:查询修改时间
-cmin [+|-] num:查询文件属性改变时间
注意上面具体的时间参数在下面给出了
注意:
+num:表示指定天数大于等于num+1天之前
num:如果只是数字,没有加减号,那么表示大于等于我们给定的前num这个天数,小于给定num天数加1
-num:从当前开始(即大于等于0)到前三天,但是不包括前第三天即小于num天数
图示这些关系
根据文件权限来查找
-perm [-|/] MODE
MODE:没有加号或者减号,表示精确权限匹配权限
MODE前给定了加号(/)或者减号( - )表示
/MODE:任何一类对象(u、g、o)的权限中只要有一个匹配即可。CentOS7.x中+号的MODE形式已经被废弃了。改用的是斜线/
案例演示
找寻/tmp目录下的所有文件的文件属性在其他组的权限上具有执行权限的文件
find /tmp -perm /001 -ls
找寻/tmp目录下的所有文件的文件属性在属组的权限上具有写或者读权限的文件
find /tmp -perm /060 -ls
-MODE:每一类对象(u、g、o)必须同时拥有为其制定的权限标准
案例演示
找寻/tmp目录下所有文件的文件属性在其他组的权限上具有可写、可执行或者可读、可写、可执行的文件
find /tmp -perm -003 -ls
处理动作
-print:默认的处理动作,显示到屏幕上
-ls:类似于对查询到的文件执行ls -l命令
-delete:删除查询到的文件,谨慎使用
-fls FILE:查询到的所有文件的长格式信息保存值指定的PATH文件中
-ok COMMAND {} \; :对查询到的每个文件执行由COMMAND指定的命令。但是这个命令在对每个文件进行命令之前都会交互是的与用户进行确认。注意:大括号与反斜线之间必须要有空格,否则报错。相对安全
-exec COMMAND {} \; :对查询到的每个文件执行由COMMAND指定的命令。但是这个不会跟用户进行交互式确认。注意:大括号与反斜线之间必须要有空格,否则报错。比较不安全
注意:花括号{ }的表示的是引用find查询到的文件,而\;表示固定格式
使用案例
查询/tmp目录下三分钟之前修改过的文件,并且将文件名改为以.new结尾
[root@oldboy ~]# find /tmp -type f -cmin - /tmp/fstab /tmp/issue [root@oldboy ~]# find /tmp -type f -cmin - -exec mv {} {}.new \; [root@oldboy ~]# find /tmp -type f -cmin - /tmp/fstab.new /tmp/issue.new
注意:find传递查询到的文件传递给后面指定的命令时,是一次性查询到所有符合条件的文件,并且一次性传递给后面的命令。这个时候要注意,有些命令不能接受过多的参数,因此可能造成溢出,此时命令可能就会执行失败。那么怎么规避这个问题呢?使用xargs命令
find | xargs COMMAND
这条命令表示:通过find命令查询到所有文件通过管道交给xargs,然后后面命令执行时,一次给命令一个参数,直至xargs给完所有内容
locate查找文件工具
非实时查找或者叫数据库查找,他不是去遍历文件系统上的所有文件,而是一开始将所有的文件做成一个索引存放在数据库中,locate就是用来查询数据库而完成查找的
locate文件的查找依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(这个是一个周期性任务)。
locate的查询速度很快。因为他是通过数据库索引进行查找的,但是他的查找不够精确,因为,文件索引在数据库中的构建需要系统自动进行,而且是在系统比较空闲时进行的,因此,当我们创建一个文件后,通过locate去查找,可能不会找到。但是我们可以手动更新数据库
手动更新文件索引数据库使用的命令updatedb。注意:文件索引的构建是非常消耗资源的,因为他要遍历整个根文件系统。当系统比较繁忙时禁止使用这个命令,因为可能其他服务无法工作
工作特点
查找速度查找
模糊查找:路径下出现某个关键词都会把相应的路径打印出来
非实时查找,非精确查找
locate基本语法
ocate keyword
使用介绍
locate就是根据keyword关键词进行查找,她会找出包含keyword所有路径
2、find的练习
查询/var/目录下属主为root且属组为mail的文件或者目录
find /var/ -user “root” -a -group “mail”
查询/usr下属主不为root、bin、或者hadoop的所有文件或者目录
find /usr -not \( -user root -o -user “bin” -o -user “hadoop” \)
find /usr -not -user root -a -not -user bin -a -not -user haddop
查询当前系统上没有属主或者属组且最近一周内曾被访问过的文件或者目录
find / -nouser -a -nogroup -a -atime -7
注意:问题的或者有不同的含义
查询/etc/目录下最近一周内其内容被修改过,同时属主不为root,也不是hadoop的文件或者目录
find /etc -not -mtime -7 -a -not \( -user root -o -user hadoop \)
find /etc -not \( -mtime -7 -o -user root -o -user hadoop \)
查询/etc/目录下大于1M且类型为普通文件的所有文件
find /etc -size +1m -type f
查询/etc/所有用户都没有写权限的文件
find /etc/ -not -perm /222
查询/etc/下至少有一类用户没有执行权限的文件
find /etc/ -not -perm -111
查询/etc/init.d/下,所有用户都有执行权限且其他用户有些权限的文件
find /etc/init.d/ -perm -113