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 条评论
登录 后参与评论

相关文章

来自专栏liuchengxu

在 Shell 脚本中调用另一个 Shell 脚本的三种方式

fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用 foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./...

682
来自专栏磨磨谈

Ceph数据盘怎样实现自动挂载

在Centos7 下,现在采用了 systemctl来控制服务,这个刚开始用起来可能不太习惯,不过这个服务比之前的服务控制要强大的多,可以做更多的控制,本节将来...

551
来自专栏流媒体

gcc用法以及静态/动态链接

-E:只进行预处理,不编译 -S:只编译,不汇编 -c:只编译、汇编,不链接 -g:编译器在编译的时候产生调试信息。 -I:指定include包含文件的...

662
来自专栏运维小白

10.26 unit介绍

unit介绍 ls /usr/lib/systemd/system //系统所有unit,分为以下类型: service 系统服务 target 多个u...

1867
来自专栏大闲人柴毛毛

深入理解Linux磁盘的奥秘

当我们想在系统里增加一块硬盘的时候,要做以下这四步工作: 对磁盘进行分区 对新建的分区进行格式化,目的是为了创建系统可用的文件系统 对新建的文件系统进行检验 将...

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

如何在Ubuntu 18.04上安装Apache Kafka

Apache Kafka是一种流行的分布式消息代理,旨在有效处理大量实时数据。Kafka集群不仅具有高度可扩展性和容错性,而且与其他消息代理(如ActiveMQ...

872
来自专栏CaiRui

Python之简单的用户登录和注册

#!/bin/bash/env python # -*- coding:utf-8 -*- def login(username,password): ...

19110
来自专栏Java开发

nohup 和>/dev/null 2>&1

在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

703
来自专栏软件开发 -- 分享 互助 成长

java入门

一、java的运行机制 高级语言的运行机制主要有编译型和解释型两种。 C/C++属于编译型语言,由专门的编译器针对特定的操作系统平台进行翻译,生成可执行代码,特...

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

如何在CentOS 7上编写自定义系统审计规则

Linux审计系统创建审计跟踪,这是一种跟踪系统上各种信息的方法。它可以记录大量数据,如事件类型,日期和时间,用户ID,系统调用,进程,使用的文件,SELinu...

1122

扫码关注云+社区