Linux中find命令的使用详解(上)

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

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前缀+已经被弃用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老安的博客

zabbix监控tomcat主机,并自动部署新主机

1482
来自专栏Java技术栈

单点登录终极方案之 CAS 应用及原理

Cookie的单点登录的实现方式很简单,但是也问题颇多。例如:用户名密码不停传送,增加了被盗号的可能。另外,不能跨域!

3172
来自专栏程序员宝库

Linux 基础:文件查找 find

在linux的日常管理中,find的使用频率很高,熟练掌握对提高工作效率很有帮助。 find的语法比较简单,常用参数的就那么几个,比如 -name、 -type...

3426
来自专栏区块链

如何基于Python写一个TCP反向连接后门

0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的渗透环境,通常第一件事就是安装虚拟机。且在攻击阶段中还需要对受害系统进行控制。常见的后门大多数是...

3617
来自专栏Python

python并发编程之多进程理论部分

一 并发与并行   无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cp...

2195
来自专栏沈唁志

GET与POST传递数据的长度分析

1643
来自专栏我的博客

PHP敏感函数关闭参考

搜索disable_functions 然后改为=disable_functions=phpinfo,dl, exec, system,passthru,pop...

3888
来自专栏JavaEdge

ZooKeeper分布式与Dubbo微服务入门

2864
来自专栏程序员宝库

Linux 基础:文件查找 find

在linux的日常管理中,find的使用频率很高,熟练掌握对提高工作效率很有帮助。 find的语法比较简单,常用参数的就那么几个,比如 -name、 -type...

37813
来自专栏乐百川的学习频道

Python HTTP库requests 介绍

前面我写的爬虫用的都是Python自带的的标准库urllib,这个库用起来还行,不过有些操作比较麻烦。所以现在我们来学习一下一个非常著名的HTTP库——requ...

24010

扫码关注云+社区

领取腾讯云代金券