find命令是各种Linux发现版中比较重要的、常用的一个命令,该命令功能强大,熟练掌握了这个命令的使用,对平时的系统运维、管理工作会起到事半功倍的效果。
一.获取帮助信息
[root@root@GeekDevOps-find ~]# find --help
[root@root@GeekDevOps-find ~]# man find
大家会发现帮助信息很多,但是不太好理解。
二.find命令的格式
通过find的在线帮助文档,我们可以知道,find命令的使用格式为:
find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
我们将[path…]之前平时很少使用的部分归为一类,简称为:option,。如此,该命令的格式即可表示为:
find [option] [PATH] [expression]
其中,’-H’ ‘-L’ ‘-P’三个选项主要是用于处理符号连接。’-H’表示除了处理命令行参数之外,不跟随其他符号链接,也就是说只跟随命令行中指定的符号连接,’-L’表示跟随所有的符号连接,’-P’是默认的选项,表示从不跟随符号连接。
[-D debugoptions]主要用于打印诊断信息。能帮助我们诊断出find命令为何不执行我们想要其执行的任务。我们来大致了解一下:
[root@GeekDevOps-find system]# find -D help
Valid arguments for -D:
help Explain the various -D options
tree Display the expression tree
search Navigate the directory tree verbosely
stat Trace calls to stat(2) and lstat(2)
rates Indicate how often each predicate succeeded
opt Show diagnostic information relating to optimisation
exec Show diagnostic information relating to -exec, -execdir, -ok and -okdir
[-Olevel]:启用查询优化。一共有从0-3四个优化级别。其中0和1级别是等价的,系统默认值为1,这个选项需要在O后面直接跟一个表示查询优化的十进制数字,如O2。
以上部分均来自于find在线帮助文档,本人仅进行了翻译、收集、整理工作,由于这一部分内容平时均使用的是默认值,其他值很少用到,点到为止,不作深入探讨。
下面让我们具体举一个例子来讨论一下find命令的格式。
[root@GeekDevOps-find system]# find /bin /etc -name shadow
/etc/shadow
由于[option]部分使用的默认值,因此命令后直接跟的是[PATH]部分的内容,在上面的例子中,PATH的值为/bin和/etc,即需要查找的文件或目录的路径,可以是绝对路径,也可以是相对路径,可以跟多个。
[expression]后跟的是需要查找的表达式。例子中用的是-name shadow这个表达式,指定条件为找到文件名是shadow的文件。这是find命令的核心内容,是需要我们重点学习的部分。表达式指定了我们要查找的是什么属性的文件。此外,表达式还可以指定一些操作,比如删除某些条件匹配的文件或内容。
三.表达式
由于关于find的在线手册有1100多行之多,非常详细,要一一做介绍的话需要花很多时间。因此,我选择性的选取在日常工作中常用的知识点进行学习。
(一)TESTS
find命令是通过文件属性查找文件的。find表达式的tests都是文件的属性条件,比如文件的各种时间,文件权限等。很多参数中会出现指定一个数字n,一般会出现以下三种写法:
+n:表示大于n。
-n:表示小于n。
n:表示等于n。
(二)按照时间进行查找
-amin:以分钟为单位通过文件的最后存取时间(access time)查找文件。
-cmin:以分钟为单位通过文件的状态修改时间(change time)查找文件。
-mmin:以分钟为单位通过文件的数据修改时间(modify time)查找文件。
-atime:以天为单位通过文件的最后存取时间(access time)查找文件。
-ctime:以天为单位通过文件的状态修改时间(change time)查找文件。
-mtime:以天为单位通过文件的数据修改时间(change time)查找文件。
-newer:查找比当前文件数据修改时间更加新一点的另外的文件。
-anewer:查找比当前文件的最后存取时间更加新一点的另外的文件。
-cnewer:查找比当前文件的状态时间更加新一点的另外的文件。
现在的时间是16:55:
[root@GeekDevOps-find ~]# ll -al
总用量 48
dr-xr-x---. 3 root root 251 1月 23 16:15 .
dr-xr-xr-x. 18 root root 238 1月 22 16:00 ..
-rw-------. 1 root root 13536 1月 23 09:03 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
-rw-r--r--. 1 root root 0 1月 23 16:14 GeekDevOps.doc
-rw-r--r--. 1 root root 0 1月 23 16:15 GeekDevOps.docx
-rw-r--r--. 1 root root 0 1月 23 16:14 GeekDevOps.txt
-rw-r--r--. 1 root root 0 1月 23 16:15 GeekDevOps.wps
-rw-r--r--. 1 root root 86 1月 23 10:40 .nmcli-history
drwxr-----. 3 root root 19 1月 11 15:43 .pki
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
-rw-------. 1 root root 4888 1月 23 15:12 .viminfo
[root@GeekDevOps-find ~]# find ./ -amin -50
./
./GeekDevOps.txt
./GeekDevOps.doc
./GeekDevOps.docx
./GeekDevOps.wps
[root@GeekDevOps-find ~]# find ./ -amin +50
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
./.bash_history
./.pki
./.pki/nssdb
./.nmcli-history
./.viminfo
[root@GeekDevOps-find ~]# find ./ -mtime +1
./.bash_logout
./.bash_profile
./.bashrc
./.cshrc
./.tcshrc
./.pki
./.pki/nssdb
[root@GeekDevOps-find ~]# find ./ -newer GeekDevOps.doc
./
./GeekDevOps.docx
./GeekDevOps.wps
-newer还有一种特殊用法,可以用来做各种时间之间的比较。比如,我想找到文件修改时间比/etc/passwd文件的change time更新的文件:
[root@GeekDevOps-find ~]# find /etc/ -newermc /etc/shadow
这个用法的原型是:find /etc/ -newerXY file。其中Y表示的是跟后面file的什么时间比较,而X表示使用查找文件什么时间进行比较。-newermc就是拿文件的modify time时间跟file的change time进行比较。X和Y可以使用的字母为:
a:文件access time。
c:文件change time。
m:文件modify time。
(三)根据用户、组查找
-uid n:文件的所属用户uid为n。
-user name:文件的所属用户为name。
-gid n:文件的所属组gid为n。
-group name:所属组为name的文件。
-nogroup:没有所属组的文件。
-nouser:没有所属用户的文件。
[GeekDevOps@GeekDevOps-find /]$ find / -uid `id -u`
...
/home/GeekDevOps
/home/GeekDevOps/.bash_logout
/home/GeekDevOps/.bash_profile
/home/GeekDevOps/.bashrc
(四)根据权限查找
-executable:文件可执行。
-readable:文件可读。
-writable:文件可写。
[GeekDevOps@GeekDevOps-find /]$ find / -writable #显示内容过多,不展示。
-perm mode:查找权限为mode的文件,mode的写法可以是数字,也可以是ugo的方式如:
[GeekDevOps@GeekDevOps-find /]$ find /home/ -perm 700 -ls
534195 0 drwx------ 2 GeekDevOps GeekDevOps 62 1月 23 17:09 /home/GeekDevOps
这个写法的等效写法为:
[GeekDevOps@GeekDevOps-find /]$ find /home/ -perm u=rwx -ls
534195 0 drwx------ 2 GeekDevOps GeekDevOps 62 1月 23 17:09 /home/GeekDevOps
另外要注意,mode指定的是完全符合这个权限的文件。
mode还可以使用/或-作为前缀进行描述。如果指定了-mode,就表示没指定的权限是忽略的,就是说,权限中只要包涵相关权限即可。如:
[GeekDevOps@GeekDevOps-find /]$ find /home/ -perm 644 -ls
534196 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 18 8月 3 05:11 /home/GeekDevOps/.bash_logout
534197 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 193 8月 3 05:11 /home/GeekDevOps/.bash_profile
534198 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 231 8月 3 05:11 /home/GeekDevOps/.bashrc
[GeekDevOps@GeekDevOps-find /]$ find /home/ -perm -600 -ls
16803401 0 drwxr-xr-x 3 root root 24 1月 23 17:09 /home/
534195 0 drwx------ 2 GeekDevOps GeekDevOps 62 1月 23 17:09 /home/GeekDevOps
534196 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 18 8月 3 05:11 /home/GeekDevOps/.bash_logout
534197 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 193 8月 3 05:11 /home/GeekDevOps/.bash_profile
534198 4 -rw-r--r-- 1 GeekDevOps GeekDevOps 231 8月 3 05:11 /home/GeekDevOps/.bashrc
以上代码块中,前面一个代码块找到所有只有644权限的文件,后面一个代码块-600就表示只要是包括了rw的其他位任意的文件。mode加/前缀表示的是,指定的权限只要某一位复合条件就可以,其他位跟-一样忽略,就是说-perm /600还可以找到400或者600这样权限的文件。目前CentOS7前缀+已经被弃用。