Find命令-Linux系统搜索利器

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


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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闵开慧

centos中tree插件的使用与注意事项

1 tree的安装 yum -y install tree 使用时直接输入tree 目录名,即可显示该目录的树形结构,示例如下: ? 这样查看目录结构一目了然,...

2708
来自专栏技术博文

在vim中快速复制粘贴多行

用vim写代码时,经常遇到这样的场景,复制多行,然后粘贴。 我现在这样做: 1. 将光标移动到要复制的文本开始的地方,按V(是大写V)进入可视模式。 2. 将光...

26310
来自专栏康怀帅的专栏

GitHub Pages 常见问题

本文列举了一些使用 GitHub Pages 遇到的问题及其解决方法。 资源 404 你可以使用以下方法中的一种来解决该问题。 禁用 jekyll 以 _下划线...

2673
来自专栏计算机编程

【kotlin】lamda语法兼容问题

众多的语法中是不是选取自己喜欢的语法就好了呢?答案肯定是否定的。我们接下来看看博主的配置:

1023
来自专栏蓝天

Exception in thread "main" java.lang.Error: Unresolved compilation problem

初学java,使用eclipse编译时,可能会遇到如下图所示的编译错误(Exception in thread "main" java.lang.Error:...

1350
来自专栏云计算教程系列

如何在Ubuntu 18.04上使用RVM安装Ruby on Rails

Ruby on Rails是一个流行的Web应用程序框架,旨在帮助您开发成功的项目,同时编写更少的代码。为了使Web开发变得有趣并且受到强大社区的支持,Ruby...

1280
来自专栏喵了个咪的博客空间

PhalGo-Viper获取配置

#PhalGo-Viper获取配置 ? viper项目地址:https://github.com/spf13/viper ##什么是viper viper是国外...

3818
来自专栏不想当开发的产品不是好测试

查看jar包的jdk版本并降级

用解压工具打开jar包(例子都是用7zip) ? 进入到META-INF目录,查看MANIFEST.MF文件,查看Bulid-Jdk,下图就为1.7.0_55版...

2397
来自专栏风中追风

volatile和synchronized 实现原理的差别

提到volatile 和 synchronized 的时候不得不提到的一个东西就是JMM(java Memory Model)java内存模型。

6099
来自专栏mySoul

Node.js多进程

使用子进程的执行命令,缓存子进程的输出。并将子进程的输出以回调函数参数的形式进行返回

1210

扫码关注云+社区