Find命令-Linux系统搜索利器

时间:2022-05-03
本文章向大家介绍Find命令-Linux系统搜索利器,主要内容包括1.Motivation、2.Explanation & Example、3.Notice、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

1.Motivation


搜索查找是管理文件系统常用的操作,虽然动作逻辑本质上是匹配,很简单,但搜索也有很多种花样,可以用来加速搜索,快速提取想要的内容

  • 最简单的搜索:你想递归遍历从当前目录下所有子目录以及子目录下的文件,得以了解这个目录组织结构
  • 基于文件名的搜索:你想递归搜索从当前目录下所有拥有特定文件名或者后缀的文件
  • 基于文件路径的搜索:你想递归搜索从当前目录下所有拥有特定路径名的路径
  • 文件名反向排除的搜索:你不知道目标文件可能是什么但可以确定目标文件绝不是什么,需要将不可能的文件排除在外
  • 目录范围模糊的搜索:当你可以确定目标文件在当前目录下的多少级范围内且目录层次较深时,超过一定级数范围的目录就可以不必搜索
  • 基于文件类型的搜索:你也许只是想要搜索目录,或者链接,或者字符设备等等,其他文件类型就可以不必搜索
  • 基于文件时间的搜索:你可能刚刚改动了许多文件但不记得名字,那么在过去的一个时间范围上对文件的三个时间进行搜索:访问时间,修改时间,变化时间
  • 基于文件大小的搜索:如果一个目录的体积很大,你想要知道在这个目录中哪些文件是大文件
  • 基于文件权限的搜索:对可读、可写、可执行以及用户访问差异来搜索文件
  • 搜索并对结果执行一系列命令:繁琐任务自动化

2.Explanation & Example


  • 最简单的搜索:
find .  #从当前目录开始递归遍历所有子目录以及下面的文件,打印出来
  • 基于文件名的搜索:
find . -name "hello.txt"   #从当前目录开始递归向下搜索名为hello.txt的文件
find . -name "*.txt"       #从当前目录开始递归向下搜索后缀名为txt的文件
find . -iname "hello*"     #从当前目录开始递归向下搜索名为hello和HELLO的文件
find . ( -name "*.txt" -o -name "*.pdf" )   #从当前目录开始向下递归搜索后缀名为txt或者pdf的文件
  • 基于文件路径的搜索:
find . -path "*/test/*"    #从当前目录开始向下递归搜索包含test路径名的路径
  • 文件名反向排除的搜索:
find . ! -name "*.txt"     #从当前目录开始向下递归搜索非txt文件
  • 目录范围模糊的搜索:
find . -maxdepth 3 -name "*.txt"    #从当前目录开始向下递归搜索最大3层目录范围内包含的txt文件
find . -mindepth 2 -name "hello*"   #从当前目录的下一级目录开始向下递归搜索名字包含hello的文件
find . ( -name ".git" -prune ) -o ( -type f )   #从当前目录开始向下递归搜索除了.git目录的其他所有目录以及包含的文件
  • 基于文件类型的搜索:
find . -type d  #从当前目录开始向下递归搜索目录文件
find . -type f  #从当前目录开始向下递归搜索普通文件
find . -type l  #从当前目录开始向下递归搜索链接文件
find . -type s  #从当前目录开始向下递归搜索套接字文件
find . -type b  #从当前目录开始向下递归搜索块设备
find . -type c  #从当前目录开始向下递归搜索字符设备
find . -type p  #从当前目录开始向下递归搜索FIFO文件
  • 基于文件时间的搜索:
find . -atime -7 #搜索7天以内访问过的文件
find . -atime 7  #搜索正好7天前访问过的文件
find . -atime +7 #搜索7天以前访问过的文件
find . -ctime 7  #搜索正好7天前改变的文件
find . -mtime 7  #搜索正好7天前修改的文件
find . -amin 7   #搜索正好7分钟前访问过的文件
find . -newer file.txt  #搜索比file的修改时间更新的文件
  • 基于文件大小的搜索:
find . -size +2k   #搜索等于2k的文件
find . -size -2k   #搜索小于2k的文件
find . -size 2k    #搜索等于2k的文件
文件大小的单位是b(512B),c(B),w(2B),k(1024B),M(1024k),G(1024M)
  • 基于文件权限的搜索:
find . -perm 644
find . -user neo
  • 搜索并对结果执行相关命令:
find . -name "*.txt" -delete     #从当前目录开始向下递归搜索txt文件并删除
find . -name "*.c" -exec cat {} ; > all_c_files  #从当前目录开始向下递归搜索c文件并将所有的内容汇聚到all_c_files
find . -mtime +10 -name "*.txt" -exec cp {} OLD ; #从当前目录开始向下递归搜索10天以前修改过的txt文件并将他们复制到OLD文件夹中
find . -type f -name "*.txt" -exec ./command.sh {} ;  #从当前目录开始向下递归搜索txt文件并交给command.sh作为参数执行

3.Notice


以上多个参数在命令后面的位置是有区别的,它们的位置决定了搜索的逻辑,也影响搜索的效率,比如限定搜索目录范围应该优先于限定搜索文件的名字

实际使用还需要从搜索逻辑来考虑多个影响因素,进而加快搜索速度,提高搜索效率