Linux文件搜索命令介绍——locate、find、xargs、touch、stat

2023-05-16

本文主要介绍两个用在Linux系统中搜索文件的工具。

  • locate:通过文件名查找文件
  • find:在文件系统目录框架中查找文件
    同时,我们也会介绍一个通常与文件搜索命令一起使用、处理搜索结果文件列表的命令。
  • xargs:从标准输入中建立、执行命令行
    还有两个辅助工具
  • touch:更改文件的日期时间
  • stat: 显示文件或文件系统的状态

0.参考文献

《Linux命令行大全》 [美] William E. Shotts. Jr 著 郭光伟 郝记生 译, 人民邮电出版社

如有侵权,可联系博主删除。

1.locate—较简单的方式查找文件

locate通过快速搜索数据库,以寻找路径名与给定子字符串相匹配的文件,同时输出所有匹配结果
例如,查找zip字符串开头的程序,由于是程序,因此目录名应该以bin/结尾

$ locate bin/zip

输出为:

/usr/bin/zipdetails
/usr/bin/zipgrep
/usr/bin/zipinfo

可以使用locate组合grep的方式进行更详细的搜索

$ locate zip | grep bin

输出为

/lib/firmware/qed/qed_init_values_zipped-8.10.10.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.10.5.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.15.3.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.20.0.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.4.2.0.bin
/lib/firmware/qed/qed_init_values_zipped-8.7.3.0.bin
/usr/bin/funzip
/usr/bin/gpg-zip
/usr/bin/unzip
/usr/bin/unzipsfx
/usr/bin/zipdetails
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/lib/klibc/bin/gunzip
/usr/lib/klibc/bin/gzip

2. find—较复杂的方式查找文件

locate程序查找文件仅仅是依据文件名,而find程序则是依据文件的各种属性在既定的目录(及其子目录)里查找
最简单的用法用find命令列出当前系统主目录(~)下的文件列表清单

$ find ~

以上命令列出了主目录下所有文件的清单。
可以使用wc程序计算find命令搜索到的文件总量。

$ find ~ | wc -l
1552390

find命令可以用来搜索符合特定要求的文件,通过综合应用test选项、action选项以及options选项实现高级文件搜索。

2.1 test选项

假定我么想要查找的是目录文件,可以添加test选项来达到此目的。

$ find ~ -type d | wc -l
42928

添加test参数-type -d可以将搜索范围限制为目录
下面例子中使用-type f则表示只对普通文件进行搜索

$ find ~ -type f | wc -l
1472037

表1 find支持搜索的文件类型

文件类型描述
b块设备文件
c字符设备文件
d目录
f普通文件
l符号链接

另外,还可以添加其他test选项实现依据文件大小文件名的搜索。
如下命令行就是用来查找所有符合*.jpg通配符格式以及大小超过1MB普通文件。

$ find ~ -type f -name "*.jpg" -size +1M | wc -l
2910

表2 find 支持的计量单位

字母单位
b512字节的块
c字节
w两个字节的字
kKB(每单位包含1,024字节)
MMB(每单位包含1,048,576字节)
GGB(每单位包含1,073,741,824字节)

find支持多种test参数,表3概括了一些常用的参数。注意,前边的“+”和“-”号的用法也适用于所有用到数值参数的情况。
表3 find命令的test参数选项

test参数描述
-cmin n匹配n分钟前改变状态(内容或属性)的文件或目录,不到n分钟就用-n,超过n分钟就用+n
-cnewer file匹配内容或属性的修改时间比文件file更晚的文件或目录
-ctime n匹配系统中n*24小时前的文件状态被修改的文件或目录
-empty匹配空文件或空目录
-group name匹配属于group组的文件或目录。name可描述为组名,也可以是其ID号
-iname pattern与-name test项功能类似只是不区分大小写
-inum n匹配索引节点是n的文件
-mmin n匹配n分钟前内容被修改的文件或目录
-mtime n匹配n*24小时前只有内容被更改的文件或目录
-name pattern匹配有特定通配符模式的文件或目录
-newer file匹配内容的修改时间比file文件更近的文件或目录。这在编写shell脚本进行文件备份时非常有用。每次创建备份时,更新某个文件,然后用find+此参数选项来确定上一次更新后哪个文件改变了
-nouser匹配不属于有效用户的文件或目录。
-nogroup匹配不属于有效组的文件或目录
-perm mode寻找访问权限与既定模式匹配的文件或目录
-samfile name与-inum test选项类似。匹配与file文件有相同node号的文件
-size n匹配n大小的文件
-type c匹配c类型的文件
-user name匹配属于name用户的文件和目录,name可以是用户名也可以描述为该组的ID号

操作符
find命令的test选项可以结合逻辑操作从而建立具有复杂逻辑关系的匹配条件。
可以使用下面命令来查找那些访问权限不是0600的文件和访问权限不是0700的子目录

$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not  -perm 0700 \)

表4 find命令的逻辑操作符

操作符功能描述
-and(与操作符)查找使该操作符两边检验条件都是真的匹配文件。有时缩写为-a。如果两个检测条件之间没有显式的显示操作符,and就是默认的逻辑关系
-or(或操作)查找使该操作符两边任何一边的检测条件为真的匹配文件。有时简写为-o
-not(-非操作)查找使该操作符后面的检测条件为假的匹配条件,有时直接写为`!
()(括号操作符)有时为了获得想要的结果必须扰乱默认的执行顺序,即使不需要,将一串字符表达式括起来对提高命令的可读性有帮助。通常使用反斜杠来避免括号字符在shell中的特殊意义

2.2 action选项

前面的find命令已经查找到所需的文件,下面处理这些文件,find命令允许直接对搜索结果执行动作。

预定义动作
表5 预定义的find命令操作

动作功能描述
-delet删除匹配文件
-ls对匹配文件执行ls操作,以标准格式输出其文件名以及所要求的其它信息
-print将匹配的文件的全路径以标准形式输出。该操作是默认操作
-quit一旦匹配成功便退出

例如

$ find ~ -print

可以使用find来删除满足特定条件的文件。例如删除.bak后缀的备份文件

$ find ~ -type f -name '*.bak' -delete

记住,每个test选项和action选项之间默认的逻辑关系是与(and)逻辑。所以test选项和action选项的顺序很重要

用户自定义操作
除了已有的预定于操作命令,同样可以任意调用用户想要执行的操作命令。传统的方法就是像以下命令行使用**-exec操作**。

-exec command {};

该格式中的command表示要执行的操作命令名,花括号{}代表的是当前路径,分号作为必须的分隔符表示命令结束。使用-exec完成-delet操作示例如下:

-exec rm '{}' ';'

注意,这里同样需要将花括号引起来或者用转义符隔开。

提高效率
当使用-exec操作时,每次查找到匹配文件后都会调用执行一次指定命令。
通过将命令行末尾的分号改为加号,便可将find命令所搜索到的匹配结果作为指定命令的输入,从而一次性完成对所有文件的操作。例如
之前的例子是

$ find ~ -type f -name 'foo*' -exec ls -l '{}' ';'

每次找到匹配文件后都会执行一次ls命令。将上述命令改为下面的命令行。

$ find ~ -type f -name 'foo*' -exec ls -l '{}' +

可以得到相同结果,不过ls只运行一次。
同样我们可以使用xargs命令获得相同的效果,xargs处理标准输入信息并将其转变为某指定命令的输入参数列表

$ find ~ -type f -name 'foo*' -print | xargs ls -l

stat命令
stat命令可以说是ls的增强版,该命令会将系统所掌握文件的所有信息及属性全部显示出来

$ stat log
  File: 'log'
  Size: 12288           Blocks: 24         IO Block: 4096   directory
Device: 801h/2049d      Inode: 40214858    Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1005/    limj)   Gid: ( 1005/    lixj)
Access: 2020-06-14 10:00:13.585565220 +0800
Modify: 2020-06-14 08:00:09.118055234 +0800
Change: 2020-06-14 08:00:09.118055234 +0800
 Birth: -

2.4 option选项

option选项用于控制find命令的搜索范围。
表7 常用的option选项

选项描述
-depth引导find程序处理目录前先处理目录内文件,当指定-delete操作时,该参数选项会自动调用
-maxdepth levels当执行测试条件行为时,设置find程序陷入目录数的最大级别数
-mindepth levels在应用测试条件和行为之前,设置find程序陷入目录数的最小及别数
-mount引导find不去遍历挂载在其它文件系统上的目录
-noleaf指导find程序不要基于“正在搜索类UNIX文件系统”的假设来优化它的搜索,当扫描DOS/Windows文件系统和CD时,会用到该选项
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux文件搜索命令介绍——locate、find、xargs、touch、stat 的相关文章

随机推荐