【Linux学习笔记】8:文件搜索命令find

时间:2021-07-15 15:33:09

find命令是Linux中最强大的搜索命令,功能多,选项和参数也会很多。

find [搜索范围] [搜索条件] 提供的必要信息

-name按名字搜索

如在/root/中按名字搜索一个文件。

[root@bogon ~]# find /root/ -name install.log
/root/install.log

很多操作在执行时会让系统压力变得很大,如杀毒、大数据的压缩、解压、拷贝等,应避免用find搜索较大的范围(服务器本身的负载压力就很大了,再执行这样的命令就可能导致宕机)。

如果要模糊查询,就要使用通配符匹配。Linux中常用的通配符有”*”匹配任意内容,”?”匹配任意一个字符,”[]”匹配任意一个中括号内的字符。有点像正则表达式。

[root@bogon ~]# find /root/ -name "install.log*"
/root/install.log.syslog
/root/install.log

匹配/root/下所有文件:

[root@bogon ~]# find /root/ "*"
/root/
/root/.cshrc
/root/install.log.syslog
/root/.tcshrc
/root/.Xauthority
/root/.bash_profile
/root/.bash_logout
/root/anaconda-ks.cfg
/root/.bash_history
/root/.bashrc
/root/install.log
find: “*”: 没有那个文件或目录

尝试使用”[]”:

[root@bogon ~]# touch lzhsb
[root@bogon ~]# touch lzhgb
[root@bogon ~]# ls
anaconda-ks.cfg install.log install.log.syslog lzhgb lzhsb
[root@bogon ~]# find /root/ -name "lzh[sg]b"
/root/lzhsb
/root/lzhgb

列出以c或者以b结尾的文件:

[root@bogon ~]# find /root/ -name "*[cb]"
/root/lzhsb
/root/.cshrc
/root/.tcshrc
/root/.bashrc
/root/lzhgb

-iname可以使搜索的文件名不区分大小写。

-user按照所有者搜索

搜索/root/目录下所有者为root的文件。

[root@bogon ~]# find /root/ -user root
/root/
/root/lzhsb
/root/.cshrc
/root/install.log.syslog
/root/.tcshrc
/root/.Xauthority
/root/.bash_profile
/root/.bash_logout
/root/anaconda-ks.cfg
/root/.bash_history
/root/.bashrc
/root/install.log
/root/lzhgb

因为/root/是root的家目录,所以里面的文件所有者肯定都是root,这就相当于遍历。

-nouser搜索没有所有者的文件(常用)

Linux中所有的文件都应有所有者,没有所有者的文件一般都是垃圾文件,有必要考虑清除。有两个特殊情况:①由Linux内核产生的文件,内核直接调用不经过系统用户,所以它产生的文件有可能没有所有者(在/proc/和/sys/中) ②外来文件,如在windows中产生的文件,放在U盘里插入Linux机,因为windows是忽略了所有者这个概念的。

[root@bogon ~]# find /proc/ -nouser
find: “/proc/2562/task/2562/fd/5”: 没有那个文件或目录
find: “/proc/2562/task/2562/fdinfo/5”: 没有那个文件或目录
find: “/proc/2562/fd/5”: 没有那个文件或目录
find: “/proc/2562/fdinfo/5”: 没有那个文件或目录
[root@bogon ~]# find /sys/ -nouser
[root@bogon ~]# find /root/ -nouser
[root@bogon ~]#

time系列

find /var/log/ -mtime +10

是在/var/log/下查找10天前修改了内容的文件。

-10:十天内修改文件。
10:十天当前修改的文件。
+10:十天前修改的文件。

atime文件访问的时间(access),ctime改变文件属性的时间(change),mtime修改文件内容的时间(modify)。
在服务器中对日志的查找就很常用到这类命令,下面试一下它。

[root@bogon ~]# find /var/log/ -mtime +10
/var/log/cups
/var/log/ntpstats
/var/log/sssd
/var/log/samba/old

-size按文件大小搜索

寻找当前目录下小于25k的文件。

[root@bogon ~]# find . -size -25k
.
./lzhsb
./.cshrc
./install.log.syslog
./.tcshrc
./.Xauthority
./.bash_profile
./.bash_logout
./anaconda-ks.cfg
./.bash_history
./.bashrc
./lzhgb

小于25k用”-25k”,正好25k用”25k”,大于25k用”+25k”。

又如寻找/etc/目录下大于2M的文件(注意这时单位M用大写的)。

[root@bogon ~]# find /etc/ -size +2M
/etc/selinux/targeted/policy/policy.24
/etc/selinux/targeted/modules/active/policy.kern

M写成小写或者k写成大写是没有用的:

[root@bogon ~]# find /etc/ -size +2m
find: 无效的 -size 类型“m”
[root@bogon ~]# find . -size 25K
find: 无效的 -size 类型“K”

-inum按照i节点号查找文件

相当于ls -i的逆操作。

[root@bogon ~]# find /root/ -inum 523270
/root/lzhsb

其它常用

-a两个条件”与”,-o两个条件”或”,用于多条件查询。
如查找/etc/目录下大于20k小于50k的文件。

[root@bogon ~]# find /etc/ -size +20k -a -size -50k
/etc/lvm/lvm.conf
/etc/mime.types
/etc/sysconfig/network-scripts/network-functions-ipv6
/etc/sound/events/gnome-2.soundlist
/etc/makedev.d/01linux-2.6.x
/etc/ld.so.cache
/etc/libreport/events/report_RHTSupport.xml
/etc/postfix/main.cf
/etc/selinux/targeted/modules/active/modules/unconfineduser.pp
/etc/selinux/targeted/modules/active/modules/samba.pp
/etc/selinux/targeted/modules/active/modules/apache.pp
/etc/selinux/targeted/modules/active/modules/postfix.pp
/etc/selinux/targeted/modules/active/modules/staff.pp
/etc/selinux/targeted/modules/active/modules/unprivuser.pp
/etc/selinux/targeted/modules/active/modules/xguest.pp
/etc/selinux/targeted/modules/active/modules/virt.pp
/etc/selinux/targeted/modules/active/modules/cups.pp

如果要对这些符合条件的文件做处理,一条条手打去做显然不合适,可以尾接:

-exec [二级命令] {} \;

表示find命令得到的结果交给二级命令去处理,如:

[root@bogon ~]# find /etc/ -size +20k -a -size -50k -exec ls -lh {} \;
-rw-r--r--. 1 root root 37K 124 2013 /etc/lvm/lvm.conf
-rw-r--r--. 1 root root 43K 63 2011 /etc/mime.types
-rw-r--r--. 1 root root 30K 19 2013 /etc/sysconfig/network-scripts/network-functions-ipv6
-rw-r--r--. 1 root root 27K 714 2010 /etc/sound/events/gnome-2.soundlist
-rw-r--r--. 1 root root 28K 619 2010 /etc/makedev.d/01linux-2.6.x
-rw-r--r--. 1 root root 39K 822 18:20 /etc/ld.so.cache
-rw-r--r--. 1 root root 22K 118 2013 /etc/libreport/events/report_RHTSupport.xml
-rw-r--r--. 1 root root 27K 513 2011 /etc/postfix/main.cf
-rw-------. 1 root root 28K 822 18:19 /etc/selinux/targeted/modules/active/modules/unconfineduser.pp
-rw-------. 1 root root 25K 822 18:19 /etc/selinux/targeted/modules/active/modules/samba.pp
-rw-------. 1 root root 26K 822 18:19 /etc/selinux/targeted/modules/active/modules/apache.pp
-rw-------. 1 root root 31K 822 18:19 /etc/selinux/targeted/modules/active/modules/postfix.pp
-rw-------. 1 root root 42K 822 18:19 /etc/selinux/targeted/modules/active/modules/staff.pp
-rw-------. 1 root root 36K 822 18:19 /etc/selinux/targeted/modules/active/modules/unprivuser.pp
-rw-------. 1 root root 26K 822 18:19 /etc/selinux/targeted/modules/active/modules/xguest.pp
-rw-------. 1 root root 23K 822 18:19 /etc/selinux/targeted/modules/active/modules/virt.pp
-rw-------. 1 root root 21K 822 18:19 /etc/selinux/targeted/modules/active/modules/cups.pp

表示对查找到的结果又执行了ls -lh命令(人性化列出了详细信息)。

又如:

[root@bogon ~]# find /root/ -inum 523270 -exec rm -f {} \;
[root@bogon ~]# ls
anaconda-ks.cfg install.log install.log.syslog lzhgb

无询问地删除了这个i节点号的文件(前面touch出的lzhsb),rm -f放在二级命令处不需要参数,只删除前面find出的文件。

注意,只有能够处理搜索出来的结果的那些文件的命令才可以放在二级命令处去。