关于 find 命令的15个超级有用的例子

news2024/11/25 22:26:19

find 命令用于在 Linux 命令行中搜索文件和目录。

find 是功能最强大、使用最频繁的命令之一,同时也是选项最多的命令之一,它有50多个选项,很容易让人弄混了,特别是当它与 exec 或 xargs 命令一起使用的时候。

作为系统管理员或者软件开发者,在命令行中工作时都不可避免的会使用到 find 命令。所以,与其畏难而逃避它,不如知难而进,拥抱它的力量。

本文我们会分享关于 find 命令的一些常见示例。不过在此之前,我们先来看一下它的语法,以及如何使用。

Linux 中的 find 命令

find 命令的一般语法为:

find [directory to search] [options] [expression]

方括号 [] 中所有的内容都是可选的,这意味着你可以在没有任何选项和参数的情况下运行 find 命令。不过这只会打印出当前路径下所有的文件和目录,这样没什么用处,对吧?

我们来详细了解一下它的参数。

  • directory to search:要搜索的目录,基本上就是我们要开始搜索的位置。默认情况下,搜索是递归的(也会搜索子目录),从当前位置开始;

    options:选项,指定搜索的类型,可以按文件名称、文件类型、修改时间等(进行搜索),这里有50多个选项;

    expression:指定的搜索词。如果是要按文件名查找,那么搜索词就是文件名;如果是要查找名称与表达式匹配的文件,那这里就用表达式。

看下面的例子:

find . -type f -name myfile

该命令将在当前目录及其子目录中进行搜索,查找名为 myfile 的文件(不是目录)。选项 -type f 表示只查找文件,单点 . 表示当前目录。

按名称查找文件和目录

可以按文件名搜索文件和目录:

find . -name SEARCH_NAME

由于没有指定文件类型,所以它会搜索具有给定名称的文件和目录。

下面的例子找到名为 mystuff 的文件和目录:

[gliu@fedora work]$ find -name mystuff
./new/mystuff
./mystuff

只查找文件或目录

如果只想查找文件,那么需要指定文件类型 -f:

find . -type f -name SEARCH_NAME

类型和名称的顺序无关紧要。上一个例子中,只查找文件,可使用如下命令:

[gliu@fedora work]$ find -type f -name mystuff
./mystuff

如果只搜索目录,那么指定类型 -d:

find . -type d -name SEARCH_NAME

还是上面那个例子,如果只查找目录,使用如下命令:

[gliu@fedora work]$ find -type d -name mystuff
./new/mystuff

执行不区分大小写的搜索

默认情况下,find 命令区分大小写。如果我们想要执行不区分大小写的搜索,可以使用 -iname 来代替 -name:

find . -type f -iname SEARCH_NAME

也可以将其与 -d 选项一起使用。

[gliu@fedora work]$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff

按扩展名搜索(重要)

find 命令最常见的用法之一就是查找指定类型的文件,或者说是按照文件扩展名来进行查找。

比如,我们要在当前目录下搜索所有的 C++ 文件,而C++文件的扩展名是 .cpp,所以我们可以这样搜索:

find . -type f -name “*.cpp”

这样,我们告诉 find 命令查找类型为文件(file),并且以 .cpp 结尾的文件。

[gliu@fedora work]$ find . -type f -name “*.cpp”
./file.cpp./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp
./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.cpp

注意:在使用 find 命令时,需要将表达式放在双引号中。

为什么要将表达式放在双引号中呢?因为如果要不这样做的话,shell会扩展通配符,将其替换为当前目录中所有以 .cpp 结尾的文件。

比如,假如当前目录下有两个文件:file1.cpp, file2.cpp,那么下面的命令:

find . -type f -name *.cpp

会被shell扩展为:

find . -type f -name file1.cpp file2.cpp

这种情况下,shell 就会给出提示:

find: paths must precede expression: ‘file1.cpp’
find: possible unquoted pattern after predicate ‘-name’?

另外,如果当前目录下只有一个扩展名为.cpp的文件,那就可以。

搜索多个扩展名(或条件)的多个文件

上述命令搜索给定扩展名的文件。那如果要同时搜索不同扩展名的文件,该怎么办呢?

可以使用逻辑或(OR) -o 来运行 find 命令:

find . -type f -name “.cpp" -o -name ".txt”

这样,就会搜索扩展名为 .cpp 或 .txt 的文件:

[gliu@fedora work]$ find . -type f -name “.txt" -o -name ".cpp”
./new.txt
./file.cpp
./new/new.txt
./new/dir2/another.txt
./new/dir1/new.txt
./another.txt

在指定目录中查找文件

我们上面的例子都是在当前目录中搜索,因为我们在命令中指定了 . 作为当前路径。

点 . 可以替换为绝对路径或者相对路径。这样我们就可以在不离开当前路径的情况下,在指定的目录中查找文件。

[gliu@fedora work]$ find ./new -name mystuff
./new/mystuff

在多个目录中搜索文件

如果你认为所要查找的文件可能位于多个位置,那么不必多次运行 find 命令,只需在 find 命令中指定要搜索的所有目录路径即可:

find ./location1 /second/location -type f -name “pattern”

查找空文件和目录

-empty 选项可以让你使用 find 命令查找空文件和目录。比如要查找当前路径下所有的空文件和目录,可使用如下命令:

find . -empty

也可以指定搜索的文件类型,只查找文件或者目录:

find . -empty -type f

还可以结合文件名使用:

find . -empty -type f -name “*.cpp”

查找大文件或小文件(根据文件大小搜索)

根据文件的大小执行搜索,可以查找大文件或者小文件。但这只适用于文件,不适用于目录。

要根据文件的大小搜索,可以使用 -size 选项,后面跟上一个值N(即文件的大小),+N 查找大于 N 的文件,-N 查找小于 N 的文件。

比如,查找大小正好为 50KB 的文件:

find . -size 50k

在当前路径下查找大于 1G 的文件:

find . -size +1G

查找小于 20 bytes 的文件(注意单位是c而不是b):

find . -size -20c

要查找大于100 MB 但小于 2 GB 的文件:

find . -size +100M -size -2G

此外,还可以结合名称搜索。比如,要在根目录中查找以 .log 结尾,大于500MB的文件,可使用如下命令:

find / -size +500M -name “*.log”

关于文件大小值 N 的单位:

c : bytes(字节)
k: kilobytes(千字节)
M: Megabytes(兆字节)
G: Gigabytes(GB)

查找最近修改的文件(根据修改或创建时间搜索)

我们先来简单介绍下mtime, atime 和 ctime 的概念:

  • mtime:文件上次修改的时间;
  • ctime:文件创建的时间;
  • atime:文件上次访问的时间。

我们经常会有查找最近修改过的文件的需求,这时候,可以按修改时间来搜索文件。

比如,要查找 3天(3 * 24H)以内修改过的所有文件:

find . -type f -mtime -3

再比如,查找 5天以前创建的文件:

find . -type f -ctime +5

上述命令是以天为单位。那么,如果要搜索几分钟前修改过的文件呢?可以使用 mmin, amin 和 cmin。

比如,要查找 5分钟以内修改过的文件,可使用如下命令:

find . -type f -mmin -5

此外,还可以结合名称,指定时间的上限和下限进行搜索。比如,下面的命令将搜索过去20分钟到30分钟内,修改过的所有 .java 文件:

find . -type f -mmin +20 -mmin -30 -name “*.java”

查找具有特定文件权限的文件

find命令允许您搜索具有特定权限的文件。

find -perm mode

比如,在当前路径下查找所有权限模式为 777 的文件:

find . -perm 777

查找具有读写权限的文件(完全匹配,如果文件权限为 读写和执行,则不匹配):

find . -perm a=r+w

根据文件的所属用户查找

find 还可以根据文件的所有权进行搜索。

比如,在当前路径下搜索用户 John 所拥有的文件:

find . -type f -user John

当然,也可以与其他选项(比如文件大小,时间,名称等)结合使用:

find . -type f -user John -name “*.cpp”

不递归查找,仅在当前目录中搜索

默认情况下,find 命令在当前位置的所有子目录中搜索。如果不希望这样,可以将搜索深度指定为 1。这将限制搜索仅限于当前目录,不包括任何子目录。

find . -maxdepth 1 -type f -name “*.txt”

在这里插入图片描述

从搜索中排除目录

如果要将某个目录从搜索中排除,可以结合 -path, -prune 和 -o 一起使用:

find . -path “./directory_exclude/*” -prune -o -name SEARCH_NAME

注意路径中的星号 *, -prune 选项在路径之后,-o 选项在 prune 之后。

基本上,prune命令要求不使用路径指定的值,它总是与 -o 一起使用,以确保 -o 的右侧只针对未被排除的目录。

处理 find 命令的输出结果(使用 exec 和 xargs)

到目前为止,我们介绍了关于find命令的一些标准查找文件的方法。此外,还可以通过对 find 命令的结果执行某些操作,来改进它。

例如,查找与特定名称模式匹配的文件并一次性重命名,或者查找空文件并删除。

我们知道,管道重定向可以用于将一个命令的输出与另一个命令输入相结合。但这对find命令的输出不起作用,至少不直接起作用。

如果要对find命令的结果执行操作,有两个选项,即 exec 和 xargs。

使用 find 和 exec

假如我们要对 find 的结果使用 ls -l 列出来,看下面的例子:

find . -type f -name “*.txt” -exec ls -l {} +

以下是输出:

[gliu@fedora work]$ find . -type f -name “*.txt” -exec ls -l {} +
-rw-rw-r-- 1 gliu gliu 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 gliu gliu 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 gliu gliu 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 gliu gliu 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 gliu gliu 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 gliu gliu 35 Oct 13 18:16 ./new.txt

不要忘记 exec 命令最后的 {} +,并且要注意 {} 和 + 之间的空格。

花括号 {} 引用 find 命令的结果,你可以将其认为是 {file1, file2, file3}。加号 + 用于终止 exec 命令。

exec 还有另一个约定:

*find . -type f -name .txt" -exec ls -l {} ;

上述命令中,分号 ; 用于代替加号 +,分号前面的反斜杠 \ 用于转义特殊字符。

{} + 的优点是它运行的命令更少,它就相当于是 ls -l file1 file2 file3;而 {} \ 则相当于运行 ls -l file1, ls -l file2, ls -l file3。

但是,{} \;具有在同一 exec 语句中多次使用 {} 的优点。例如,下面的命令将使用 .old 扩展名重命名所有找到的文件:

*find . -type f -name .txt" -exec mv {} {}.old ;

使用 xargs

许多 Linux 用户已经习惯了管道重定向。这个带有尾随 { }+ 的 exec 命令对他们来说似乎不太习惯。

这就是 xargs 命令存在的价值,你只需要通过管道将 find 命令的输出解析到 xargs 命令:

find . -type f -name *.txt" | xargs ls -l

在这里插入图片描述

find 结合 grep 使用

上面我们介绍了 find 结合 exec 和 xargs 命令的使用,此外,还可以将 find 与 grep 命令一块使用。

对于任何系统管理员或软件开发人员来说,find 和 grep 是最常见且最有用的组合之一。

你可以使用 find 命令来查找文件,然后使用 grep 命令来搜索这些文件的内容。

比如,我们要搜索所有包含 “Alice”一词的 txt 文件,那么可以这样搜索:

find . -type f -name “*.txt” -exec grep -i alice {} +

同样的,也可以使用 xargs 命令:

find . -type f -name “*.txt” | xargs grep -i alice

在这里插入图片描述

当然,这是最简单的例子,如果你熟悉 grep 命令,可以根据自己的需求和喜好使用它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI创作教程之 如何在本地 PC 上运行稳定的 Diffusion 2.0 (无代码指南)

AI 的热门图像生成器 Stable Diffusion日前发布了全新的 2.0版本。新版本比以前的版本带来了许多进步和改进。OpenCLIP 中新的深度检测和更好的文本到图像模型是我最兴奋的功能。 查看本文以查看 SD 2.0 中新增功能的完整列表。 在本文中,我将向您展示如何在本地 PC 上试用新…

PHP基于thinkphp的在线教学网站#毕业设计

在线教学系统采用B/S模式,促进了在线教学系统的安全、快捷、高效的发展。传统的管理模式还处于手工处理阶段,管理效率极低,随着用户的不断增多,传统基于手工管理模式已经无法满足当前用户需求,随着信息化时代的到来&am…

DataFrame API入门操作及代码展示

文章目录DataFrame风格编程DSL风格编程代码示例相关API相关代码示例SQL风格编程代码示例相关API相关代码Fucntions包基于SparkSQL的WordCount代码编写DataFrame风格编程 DataFrame支持两种风格进行编程 DSL风格SQL风格 DSL称之为领域特定语言,其实就是指DataFrame特…

Config配置文件读写

配置文件本质上是包含成功操作程序所需信息的文件,这些信息以特定方式构成。它们不是在程序中进行硬编码,而是用户可配置的,通常存储在纯文本文件中。 写配置文件 使用函数WritePrivateProfileStringW写配置文件 BOOL WritePrivateProfile…

filter: grayscale(1); | 网页变灰

效果 MDN: https://developer.mozilla.org/zh-CN/docs/Web/CSS/filter-function/grayscalegrayscale(amount)对图片进行灰度转换转换值的大小,可以是 或 . 当值为 100% 时,灰度最大。0% 时与原图没有区别。0% 到 100% 之间的值会使灰度线性变化。amount …

JVM学习笔记(2)—— 运行时数据区概述及线程

在上一篇中我们讲了JVM的类加载子系统,现在我们就来到了运行时数据区。而不同版本的JVM对于内存的划分方式和管理机制存在着部分差异(最典型的就是方法区实现的差异),本文针对经典的Hotspot jvm进行讨论,对运行时数据区…

Mongoose应用和文件上传

一、Express框架访问MongoDB数据库 1、目的: ​ (1)mongoose模块的使用 ​ (2)学会代码的封装:dao层、service层、接口层 ​ (3)MVC设计思想:M(Model)、V(View)、C(C…

WEB前端期末大作业——关于酒店主题网站设计——高级酒店公寓网页(4页)

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

如何使用gitee码云?创建库,克隆远程仓库,上传代码,小绿格等问题

目录 前提软件:先安装Git,再安装TortoiseGit(可以在网上找找~默认下一步安装即可) 一、访问网站Gitee - 基于 Git 的代码托管和研发协作平台 二、创建库 二、克隆远程仓库到本地电脑 - 仓库与本地链接 三、上传文件到gitee库里…

【Linux基础知识点】内核、系统调用、Shell、指令集、微架构、硬件架构、用户态、内核态、进程、用户线程、内核线程

参考 Linux内核版本和发行版本Linux架构用户态和内核态的简单理解「建议收藏」CPU、操作系统内核、ARM内核与架构的理解【科普】一文看懂指令集是什么一文搞懂X86架构和ARM架构的区别线程和进程的区别是什么?如何理解内核线程、内核进程? 讲解 知识点详…

Linux 业务突然宕机、系统卡死、磁盘空间爆满,该怎么查?

场景 在服务器运维过程中,我们偶尔会发现业务突然宕机,进去服务器发现异常卡顿查看服务器磁盘空间发现磁盘满载。 如何找到占用空间大的目录或文件? 1、比较笨的方法: 在根目录下,du -hs命令,列出各目录…

Redis缓存问题

目录 1、缓存穿透 2、缓存击穿 3、缓存雪崩 ​​​​​​​4、Redis的并发竞争key问题 ​​​​​​​1、缓存穿透 大量请求缓存中和数据库不存在的数据。 大量用户请求缓存中和数据库中不存在的数据,导致所有请求都落到数据库上,造成数据库短时间内承…

GAMES202 Real-Time Global Illumination

文章目录Lecture 7 Real-time Global Illumination (in 3D)RSM (Reflective Shadow Maps)Lecture 8 Real-time Global Illumination (screen space)LPV (Light Propagation Volumes)VXGI (Voxel Global Illumination)SSAO (Screen Space Ambient Occlusi…

零基础如何入门Web性能测试?

1、目前正在研究jmeter,请问初期做性能,应先从几点做起? Jmeter和LR都是目前性能测试的首选工具,如果你有LR的学习背景,那么Jmeter上手会很快,重点理解线程和进程的概念,流程和LR是类似的。如果…

ISO27001信息安全管理体系具体要求 学习笔记

ISO27001制定背景 ISO27000 从诞生到现在只不过 20 年间的事情,但基本上可以看出一个标准 “源于生活,高于生活”的发展特点,也就是说,一个真正普遍适用并能被普遍接受的标准,必然是能体现相关领域最佳惯例并能为最佳…

这篇文章告诉你视频转音频软件哪个好用,有需自取

大家看过线下的演唱会或livehouse吗?有些歌手会在现场准备一些小彩蛋,例如演唱还未发行的歌,或是歌曲的其它版本,这时候许多歌迷都会纷纷录制下来,以便后续的欣赏观看。 但是每次想听的时候,都得反复的打开…

工业外观设计中色彩如何有效运用

我相信业内很多设计师都在考虑如何在工业产品外观设计中有目的地运用色彩。最近看了一篇关于如何在工业产品中使用色彩的论文,简单地说了一下自己的想法。 一、加工技术应考虑产品外观设计 工业设计师不仅要考虑材料,还要考虑其表面处理及其颜色。因此&a…

抖音变现模式?80%的人都不知道的秘密,三类更适合玩私域的产品

这篇内容关于适合玩私域的三类产品,精简一下让大家可以3分钟看完。不玩悬念,直接上千货。 上一篇在我赢助手小禾呈序上给大家讲了三个变现的建议,以及两种我比较推荐的变现方式。带货和支付费。今天再讲一个主流的变现思路,最后还…

Android Material Design之MaterialButtonToggleGroup(九)

效果图 资源引入 implementation androidx.appcompat:appcompat:1.3.0 implementation com.google.android.material:material:1.4.0属性 属性描述android:id控件Idandroid:layout_width控件长度android:layout_height控件高度app:checkedButton默认选中得按钮idapp:selectio…

物联网毕业设计 单片机家庭气象站设计与实现

文章目录1 简介2 主要器件引脚连接3 实现效果4 部分实现代码1 简介 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始,各个学校对毕设的要求越来越高&#x…