本文主要介绍两个用在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 支持的计量单位
字母 | 单位 |
---|
b | 512字节的块 |
c | 字节 |
w | 两个字节的字 |
k | KB(每单位包含1,024字节) |
M | MB(每单位包含1,048,576字节) |
G | GB(每单位包含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(使用前将#替换为@)