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

简介: find命令是各种Linux发现版中比较重要的、常用的一个命令,该命令功能强大,熟练掌握了这个命令的使用,对平时的系统运维、管理工作会起到事半功倍的效果。

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 123 16:15 .
dr-xr-xr-x. 18 root root   238 122 16:00 ..
-rw-------.  1 root root 13536 123 09:03 .bash_history
-rw-r--r--.  1 root root    18 1229 2013 .bash_logout
-rw-r--r--.  1 root root   176 1229 2013 .bash_profile
-rw-r--r--.  1 root root   176 1229 2013 .bashrc
-rw-r--r--.  1 root root   100 1229 2013 .cshrc
-rw-r--r--.  1 root root     0 123 16:14 GeekDevOps.doc
-rw-r--r--.  1 root root     0 123 16:15 GeekDevOps.docx
-rw-r--r--.  1 root root     0 123 16:14 GeekDevOps.txt
-rw-r--r--.  1 root root     0 123 16:15 GeekDevOps.wps
-rw-r--r--.  1 root root    86 123 10:40 .nmcli-history
drwxr-----.  3 root root    19 111 15:43 .pki
-rw-r--r--.  1 root root   129 1229 2013 .tcshrc
-rw-------.  1 root root  4888 123 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 123 17:09 /home/GeekDevOps

这个写法的等效写法为:

[GeekDevOps@GeekDevOps-find /]$ find /home/ -perm u=rwx -ls
534195    0 drwx------   2 GeekDevOps GeekDevOps       62 123 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前缀+已经被弃用。

相关文章
|
2天前
|
Linux 数据处理 数据安全/隐私保护
Linux中的groups命令:管理用户组信息的利器
`groups`命令在Linux中用于显示用户所属的用户组,帮助管理员进行权限管理。它读取`/etc/group`和`/etc/passwd`文件获取信息,特点是简单直观,支持多用户组。命令参数如`-a`显示主组,`-g`显示主组ID,`-n`以数字形式显示,`-r`显示实际组。在实际应用中,结合其他命令可进行权限分析和定制输出。注意权限问题及用户组可能随系统变化。
|
2天前
|
关系型数据库 Linux 数据处理
深入了解Linux命令gprof:数据处理和分析利器
gprof是Linux下的一款命令行工具,用于分析程序性能,找出代码瓶颈。它通过分析函数调用和执行时间,提供函数级别的性能报告和图形化展示。使用gprof需在编译时添加`-pg`选项,然后运行程序并用gprof生成报告。注意覆盖所有执行路径,并可与其他性能工具结合使用,以优化代码性能。
|
2天前
|
安全 算法 Linux
探索Linux命令gpgv2:安全通信与数据验证的利器
`gpgv2`是GPG的签名验证工具,用于确保文件完整性和来源真实性。基于公钥密码学,支持多种加密算法和OpenPGP标准。通过`--verify`等参数验证签名,例如`gpgv2 --verify signature_file file`。重要注意事项包括保护私钥、定期更新密钥、验证签名来源及使用强密码。在数据安全场景中,`gpgv2`是保障信息安全的利器。
|
2天前
|
安全 Linux 数据处理
深入探索Linux中的gpgsplit命令
`gpgsplit`是GPG套件的一部分,用于分割大型加密文件或合并加密的OpenPGP消息。它支持ASCII armored和二进制格式,提供按字节数、行数或消息数分割的灵活性,并可合并消息。在处理大型加密文件、安全管理及数据传输中发挥作用。使用时注意保护私钥、备份数据、正确指定格式,并遵循安全实践。示例:使用`--split 10M`将大文件按10MB分割,`cat`多个消息文件并用`gpgsplit --output`合并。
|
2天前
|
Linux 开发者
Linux基础:常用命令及其用途
这些命令只是Linux命令行的冰山一角,但它们构成了日常工作的基础。通过掌握这些基本命令,你可以更有效地利用Linux系统的强大功能。随着你对这些基础命令的熟练应用,你会发现自己能够更快地完成任务并解决问题。
10 2
|
2天前
|
消息中间件 Unix Linux
[高频]Linux中常见的命令及常见面试题
[高频]Linux中常见的命令及常见面试题
|
3天前
|
算法 数据挖掘 Linux
探索Linux中的awk命令:强大的文本分析工具
探索Linux中的`awk`命令,一个强大的文本分析工具,用于模式扫描、数据提取与报告生成。本文介绍`awk`的用途、工作原理、特点及应用示例。`awk`基于"模式-动作"框架,从输入数据中匹配模式并执行相应操作。其特点包括:强大的文本处理能力、灵活的I/O及简洁的语法。示例涵盖了打印特定行、处理字段、计算统计值等场景。使用`awk`时要注意理解输入数据、测试脚本、优化性能和添加注释。深入学习以提升数据处理技能。
|
3天前
|
Linux Perl
Linux命令split的使用方法说明
【6月更文挑战第11天】Linux命令split的使用方法说明
14 4
|
5天前
|
Ubuntu Linux 测试技术
探索Linux中的`dbus-send`命令
`dbus-send`是Linux中用于进程间通信的D-Bus系统的命令行工具,允许应用程序通过消息总线相互交互。要安装它,可以使用包管理器(如`apt-get`或`dnf`)。基本语法包括指定总线类型、目标服务、消息类型、对象路径、接口及方法等。示例用法包括使用`dbus-send`来锁定屏幕(通过调用`org.gnome.ScreenSaver.Lock`)和设置音量(通过与PulseAudio服务交互)。在使用时,需了解目标服务的接口和方法,并确保具备相应权限。
149 10
|
5天前
|
SQL Oracle 关系型数据库
探索 Linux 命令 `db_archive`:Oracle 数据库归档日志的工具
探索 Linux 中的 `db_archive`,实际与 Oracle 数据库归档日志管理相关。在 Oracle 中,归档日志用于恢复,当在线重做日志满时自动归档。管理员可使用 SQL*Plus 查看归档模式,通过 `RMAN` 进行备份和恢复操作。管理归档日志需谨慎,避免数据丢失。了解归档管理对 Oracle 管理员至关重要,确保故障时能快速恢复数据库。