Linux 文件搜索神器 find 实战详解,建议收藏!
大家好,我是肖邦,这是我的第 10 篇原创文章。
在 Linux 系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过 200M 文件,查看近 7 天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求 find
命令都可以轻松胜任。
在 Linux 系统文件中常用的属性可以分为以下内容:名称、大小、权限、属主、修改时间、访问时间等,find 命令可以按照指定的属性为条件进行查找。
废话不多,直接开干,下边进入案例实战。
案例实战
(一)按文件名称查找
按照文件名称查找是 find 最常见的用法,需要注意的是,搜索的文件名必须完全匹配,才能找到对应的文件。
1. 查找当前目录下所有 go 文件
2. 在 etc 目录下,查找大写字母开头的 txt 文件
3. 在当前目录下查找不是 out 开头的 txt 文件
4. 在当前目录除 git 子目录外查找 txt 文件
5. 找出某个文件的所有硬链接,ls 命令 -i
选项可以查看文件的 inode 号
这里补充一个小技巧,搜索文件时使用 -iname
参数可以忽略文件名称大小写
(二)按文件类型查找
1. 在当前目录下,查找软连接文件
2. 在当前目录下,查找 log 结尾的普通文件,f
表示普通文件类型
(三)按文件大小查找
1. 查找小于 64k 的文件
2. 查找大小超过 200M 的文件
(四)按时间查找
1. 查找 2 天内被修改过的文件
2. 查找 2 天前被更改过的文件,-mtime
表示内容修改时间
3. 查找一天内被访问的文件,-atime
表示访问时间
4. 查找一天内状态被改变的文件,-ctime
表示元数据被变化时间
5. 查找比 chopin.txt 新的文件
(五)根据权限查找
1. 查找当前目录权限为 644
的文件
2. 查找 etc 目录下至少有一个用户有写权限的文件
3. 查找 etc 目录下所有用户都有执行权限的文件
(六)组合条件
1. 查找当前目录下属于 chopin 用户的普通文件,-a
可以省略
2. 查找当前目录下大于 2M 或 2 天前被修过的文件
3. 查找当前目录下不是普通文件
4. 查找非空文件
(七)处理动作
find 根据上述各种条件查找后,支持执行相关的处理动作,可以让我们的更方便和灵活,而不只是打印出来
1. -print
默认为打印,可省略
2. -ls
以 ls 长文件的格式形式输出
3. -delete
删除查找到的文件
4. -exec
将查找到的文件传递给 command 命令。下边例子是将查找到的文件传递给了 ls 命令,同理我们可以传递给任何一个 Linux 命令,功能十分强大,也很灵活。
5. -ok
与 -exec
功能一样,只是操作时会提示用户确认,仅此而已。当然,在生产环境上,我们还是推荐使用 ok
(八)经典案例
如果存在一个名称乱码的文件,想要删除它,该怎么办?即使我们复制乱码名称到命令行,很有可能终端不能正确识别。不用担心,下边来展示下 find 是如何优雅的解决问题的。
命令中,-inum
指定的是文件的 inode
号,它是系统中每个文件对应的唯一编号,find 通过编号找到后,执行删除操作。
总结归纳
find
命令是 Linux 命令中最有用的命令之一,它的功能非常强大,且语法复杂。其实我们不一定需要了解它的所有细节,掌握上述实战案例中的常见用法,足够满足日常工作中的大部分需求。
下边我们一起来总结下 find 命令常见用法,加深对 find 使用方法的理解。
命令格式
find path -option [-exec ...]
按文件名查找
-name
:按照文件名称查找,准确匹配;-iname
:不区分文件名的大小写;-inode
:按照文件 inode 号查找;
按照文件类型查找
按照文件类型查找,可以使用 -type
选项,具体支持的文件类型如下:
f
:普通文件d
:目录文件l
:链接文件s
:套接字文件p
:管道文件b
:块设备文件,比如:磁盘c
:字符设备文件,比如:键盘、鼠标、网卡
按照文件从属关系查找
-user
:以用户名查找-group
:以组名查找-uid
:以用户 ID 查找-gid
:以组 ID 查找-nouser
:查找没有属主的文件-nogroup
:查找没有属组的文件
按照文件大小查找
按照文件大小查找功能十分常用,用 -size
选项,选项后边指定大小 1024M
,表示大小的格式有如下几种:
-5M
:查找小于 5M 的文件+5M
:查找大于 5M 的文件5M
:查找大小为 5M 的文件
单位支持的有 c(字节)
、k
、M
、G
等,需要注意的是默认单位并不是字节,而是 b
,大小为 512 字节。
按照时间查找
按照时间查找的功能对系统管理员来说,十分常用,find 支持如下几种时间类型:
atime
:以访问时间查找mtime
:以数据修改时间查找ctime
:以元数据修改时间查找newer
:以文件为条件,判断比它新的文件
按时间查找时,使用格式如下:
-atime -5
:表示 5 天内访问过的文件;-atime +5
:表示 6 天前访问过的文件;-atime 5
:表示前 5-6 那一天访问的文件;
这个 +5
含义总是被人理解错,误认为是 5 天后修改的文件,如果能知道未来 5 天的事情,小编早就去买彩票了!可能这么说还不是很清楚,直接看图吧!
find 不仅可以按 天
为单位来查找文件,可以按照 amin
、mmin
、cmin
来查找,区别只是 min 选项单位为分钟。
按照权限查找
按权限查找是通过 -perm
选项,可以按照如下方式使用:
-perm 644
:精确权限查找-perm /666
:任何一类用户中的任何一位符合条件即满足-perm -222
:每一类用户的每一位同时符合条件即满足
组合条件
find 可以使用多个条件的组合,支持 -a
、-o
、-not
或 !
,比较简单,不再详细描述其含义。
处理动作
find 根据各种条件查找后,支持执行相关的处理动作,可以让我们的更方便和灵活,而不只是打印出来。
-print
:打印,默认动作,可省略-ls
:以 ls 长文件格式输出-delete
:删除查找到的文件-exec
:查找到的文件传递给任何 Linux 命令-ok
:与 exec 功能相同,区别是需要用户确认每次的操作
再啰嗦一下,find 命令支持的参数和选项比较多,文中只是总结出最常用、核心的参数选项。如果上述命令确实不满足需求,可以请教你的男人 man find
。
这里需要提一下,find
搜索文件时通过扫描磁盘来进行的,尽可能不要大范围的搜索文件,尤其是在 /
目录下搜索,会长时间消耗服务器的 cpu 资源。如果是生产环境的机器,执行前要考虑是否会对业务造成影响。
扩展 locate
虽然 find 功能非常强大,但要知道的是,find 执行过程是通过扫描磁盘文件来进行查找的,如果大范围的查找文件,需要花费的时间很长,且消耗服务器 cpu 资源。
这里推荐另一个 Linux 文件查找神器 locate
,类似于 win 平台下的 everything
。它基于索引表进行查询,查询速度非常快,基本不占用 cpu 资源。
使用方法非常简单
需要注意,如果是当天新创建的文件,通过 locate
默认是查不到的,因为它的数据库默认是每天自动更新一次。如果希望查询到当天创建的新文件,需要执行 updatedb
即可。
查找速度快是 locate
的优势,但它的缺点也非常明显:
模糊查询
查找匹配模式单一
查询的名称匹配路径命令
索引表的建立会占用磁盘空间
非实时查询,当天数据可能查不到
好了,到这里关于 find
命令的全部内容已经结束,希望文中的案例和总结能够帮助你更好的使用它。同时也强烈建议收藏本文,以作为 Linux 常用命令手册。
好了,本次分享就到这里了!谢谢大家,我是肖邦,欢迎关注后续的精彩内容。
推荐阅读:
版权声明: 本文为 InfoQ 作者【程序员肖邦】的原创文章。
原文链接:【http://xie.infoq.cn/article/f15ab930280f6f47f3411e244】。文章转载请联系作者。
评论