#find: 文件查找,针对文件名,精确查找,磁盘搜索,io读写,cpu开销大

find [options] [path...] [expression] [action]

b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
s - socket文件
-size n[cwbkMG] : 文件大小 为 n 个由后缀决定的数据块。其中后缀为:
b: 代表 512 位元组的区块(如果用户没有指定后缀,则默认为 b)
c: 表示字节数
k: 表示 kilo bytes (1024字节)
w: 字 (2字节)
M:兆字节(1048576字节)
G: 千兆字节 (1073741824字节)
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-maxdepth 查找最大目录层数 如 1,即只查找一层目录
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统mount点。
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
-and 条件与 
-or 条件或
===expression===

按文件名:
[root@localhost ~]# find /etc -name "ifcfg-eth0"
[root@localhost ~]# find /etc -iname "ifcfg-eth0"            //-i忽略大小写
[root@localhost ~]# find /etc -iname "ifcfg-eth*"
按文件大小:
[root@localhost ~]# find /etc -size +5M                        //大于5M
[root@localhost ~]# find /etc -size 5M
[root@localhost ~]# find /etc -size -5M
[root@localhost ~]# find /etc -size +5M -ls                    //-ls找到的处理动作
指定查找的目录深度:
-maxdepth levels
-mindepth levels
[root@localhost ~]# find / -maxdepth 4 -a  -name "ifcfg-eth0"
按时间找(atime,mtime,ctime):
[root@localhost ~]# find /etc -mtime +5                      //修改时间超过5天
[root@localhost ~]# find /etc -mtime 5                       //修改时间等于5天
[root@localhost ~]# find /etc -mtime -5                      //修改时间5天以内
按文件属主、属组找:
[root@localhost ~]# find /home -user jack                    //属主是jack的文件
[root@localhost ~]# find /home -group hr                     //属组是hr组的文件
[root@localhost ~]# find /home -user jack -group hr
[root@localhost ~]# find /home -user jack -a -group hr
[root@localhost ~]# find /home -user jack -o -group hr

[root@localhost ~]# find /home -nouser
[root@localhost ~]# find /home -nogroup
[root@localhost ~]# find /home -nouser -o -nogroup 

按文件类型:
[root@localhost ~]# find /dev -type f                           //f普通
[root@localhost ~]# find /dev -type d                           //d目录
[root@localhost ~]# find /dev -type l                           //l链接
[root@localhost ~]# find /dev -type b                           //b块设备
[root@localhost ~]# find /dev -type c                           //c字符设备
[root@localhost ~]# find /dev -type s                           //s套接字
[root@localhost ~]# find /dev -type p                           //p管道文件

按逻辑查找:
[root@localhost ~]# find ./ -name '*.py' -and  -name '1*'                      //查找已py结尾并且已1开头 
的文件
[root@localhost ~]# find ./ -name '*.py' -a  -name '1*'                        //上面的-and可以简写为-a
[root@localhost ~]# find / -name 'passwd' -or -name 'group'                    //查找名字包含passwd 或 
者 包含group的文件
[root@localhost ~]# find / -name 'passwd' -o -name 'group'                     //同样-or可以简写为-o
[root@localhost ~]# find ./ -name '*.log' -and -ctime +5 |xargs rm -rf {}\;    //查找已.log结尾并且创建 
时间在5天以前的文件,找到后删除

按文件权限:
[root@localhost ~]# find . -perm 644 -ls 
[root@localhost ~]# find . -perm -644 -ls
[root@localhost ~]# find . -perm -600 -ls
[root@localhost ~]# find . -perm -222 -ls                            //全局可写
[root@localhost ~]# find /usr/bin /usr/sbin -perm -4000 -ls          //包含set uid
[root@localhost ~]# find /usr/bin /usr/sbin -perm -2000 -ls          //包含set gid
[root@localhost ~]# find /usr/bin /usr/sbin -perm -1000 -ls          //包含sticky

按正则表达式:
-regex pattern
[root@localhost ~]# find /etc  -regex  '.*ifcfg-eth[0-9]'
.*       任意多个字符
[0-9]  任意一个数字

[root@localhost ~]# find /etc -regex '.*ifcfg-enp0s25'
/etc/sysconfig/network-scripts/ifcfg-enp0s25

[root@localhost ~]# find /etc -regex '.*ifcfg-enp0s[0-9]+'
/etc/sysconfig/network-scripts/ifcfg-enp0s25

==找到后处理的动作 ACTIONS: (默认动作-print)==

-print
-ls
-delete
-exec 后面跟自定义的shell命令
-ok 后面跟自定义的shell命令

[root@localhost ~]# find /etc -name "ifcfg*"
[root@localhost ~]# find /etc -name "ifcfg*" -print
[root@localhost ~]# find /etc -name "ifcfg*" -ls
[root@localhost ~]# find /etc -name "ifcfg*" -exec cp -rvf {} /tmp \;
[root@localhost ~]# find /etc -name "ifcfg*" -ok cp -rvf {} /tmp \;

[root@localhost ~]# find /etc -name "ifcfg*" -exec rm -rf {} \;
[root@localhost ~]# find /etc -name "ifcfg*" -delete

扩展知识:find结合xargs
[root@localhost ~]# find . -name "yang*.txt" |xargs rm -rf         
[root@localhost ~]# find /etc -name "ifcfg-eth0" |xargs -I {} cp -rf {} /var/tmp

find练习
1. 将/etc/中的所有目录(仅目录)复制到/tmp下,目录结构不变
# find /etc -type d -exec mkdir /tmp/{} \;

2. 将/etc目录复制到/var/tmp/
将/var/tmp/etc中的所有目录设置权限777(仅目录)
将/var/tmp/etc中所有文件权限设置为666
# cp -rf /etc /var/tmp/ 
# chmod -R a=rwX /var/tmp/etc/
或者
find /var/tmp/etc/ -type d -exec chmod 777 {} \;         //分号是找到一个设置一个权限
find /var/tmp/etc/ -type d -exec chmod 777 {} \+        //加号是统一找到后设置权限
find /var/tmp/etc/ ! -type d -exec chmod 777 {} \+ 

3. 以下命令的区别是什么?
[root@localhost ~]# find /etc -name "ifcfg*" -exec rm -rf {} \;
[root@localhost ~]# find /etc -name "ifcfg*" -exec rm -rf {} \+
[root@localhost ~]# mkdir dir1
[root@localhost ~]# touch dir1/file{1..20}

[root@localhost ~]# find /root/dir1 -name "file5"
[root@localhost ~]# find /root/dir1 ! -name "file5"

[root@localhost ~]# find /root/dir1 -name "file5" -o -name "file9" 
/root/dir1/file5
/root/dir1/file9

[root@localhost ~]# find /root/dir1 -name "file5" -o -name "file9" -ls
1466515    0 -rw-r--r--   1 root     root            0 6月  5 11:15 /root/dir1/file9

[root@localhost ~]# find /root/dir1 -name "file5" -ls  -o -name "file9" -ls
1466499    0 -rw-r--r--   1 root     root            0 6月  5 11:15 /root/dir1/file5
1466515    0 -rw-r--r--   1 root     root            0 6月  5 11:15 /root/dir1/file9

[root@localhost ~]# find /root/dir1 \( -name "file5" -o -name "file9" \) -ls
1466499    0 -rw-r--r--   1 root     root            0 6月  5 11:15 /root/dir1/file5
1466515    0 -rw-r--r--   1 root     root            0 6月  5 11:15 /root/dir1/file9

[root@localhost ~]# find /root/dir1 \( -name "file5" -o -name "file9" \) -exec rm -rvf {} \;
removed ‘/root/dir1/file5’
removed ‘/root/dir1/file9’

#locate(locate) 命令用来查找文件或目录。 locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一 
个数据库/var/lib/mlocate/mlocate.db 。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天 
自动更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查 
找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数 
据库。整个locate工作其实是由四部分组成的:
/usr/bin/updatedb   主要用来更新数据库,通过crontab自动完成的
/usr/bin/locate         查询文件位置
/etc/updatedb.conf   updatedb的配置文件
/var/lib/mlocate/mlocate.db  存放文件信息的文件
计划任务:每天自动更新数据库 /etc/cron.daily/mlocate.cron
手动更新数据库:updatedb
用法
locate [OPTION]... [PATTERN]...

选项
-b, --basename         match only the base name of path names
-c, --count            只输出找到的数量
-d, --database DBPATH  使用DBPATH指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
-e, --existing         only print entries for currently existing files
-L, --follow           follow trailing symbolic links when checking file existence (default)
-h, --help             显示帮助
-i, --ignore-case      忽略大小写
-l, --limit, -n LIMIT  limit output (or counting) to LIMIT entries
-m, --mmap             ignored, for backward compatibility
-P, --nofollow, -H     don't follow trailing symbolic links when checking file existence
-0, --null             separate entries with NUL on output
-S, --statistics       don't search for entries, print statistics about eachused database
-q, --quiet            安静模式,不会显示任何错误讯息
-r, --regexp REGEXP    使用基本正则表达式
  --regex            使用扩展正则表达式
-s, --stdio            ignored, for backward compatibility
-V, --version          显示版本信息
-w, --wholename        match whole path name (default)

示例
示例1: 搜索etc目录下所有以my开头的文件
[root@cent7 lib]# locate /etc/my
/etc/my.cnf
示例2:新增的文件无法locate,使用updatedb
[root@cent7 ~]# touch new.txt
[root@cent7 ~]# locate new.txt
[root@cent7 ~]# updatedb
[root@cent7 ~]# locate new.txt
/root/new.txt

示例3:updatedb的配置文件/etc/updatedb.conf
[root@cent6 ~]# cat /etc/updatedb.conf 
PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs 
devpts ecryptfs exofs fuse fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs 
nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf 
usbfs"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid 
/var/tmp"
第一行PRUNE_BIND_MOUNTS="yes"的意思是:是否进行限制搜索。

第二行是排除检索的文件系统类型,即列出的文件系统类型不进行检索。

第二行表示对哪些后缀的文件排除检索,也就是列在这里面的后缀的文件跳过不进行检索。不同后缀之间用空格隔开。

第四行是排除检索的路径,即列出的路径下的文件和子文件夹均跳过不进行检索。updatedb之后使用locate仍然找不到想要文 
件

可以检查挂载的目录是否被忽略了