Linux 中 Find 命令的 15 个超级有用的例子,真香
ahcoder 2025-01-05 15:32 15 浏览
find 命令用于在 Linux 命令行中搜索文件和目录。
find 是最强大和最常用的命令之一,它也是最广泛的命令之一,有 50 多个选项,这使它有点混乱,特别是当它与 exec 或 xargs 命令配对时。
系统管理员或软件开发人员在命令行中工作时不可能避免使用 find 命令。
我将讨论您可能会使用的一些最常见的 find 命令示例。
在 Linux 中查找命令
find 命令的一般语法是:
find [directory to search] [options] [expression]
括号 [] 中的所有内容都是可选的,这意味着您可以在find没有任何选项和参数的情况下运行命令,它只会转储当前位置的所有文件和目录。这不是很有用,对吧?
让我们更详细地看一下:
- directory to search基本上是您要开始搜索的位置,默认情况下,搜索是递归的,并从您当前的位置开始。
- options 指定搜索类型,可以是名称、类型、修改时间等,这里有 50 多个可能的选项。
- expression允许您指定搜索词。如果要按文件名查找文件,则表达式是文件名,如果要查找名称与模式匹配的文件,请在模式中表达。
我举个简单的例子:
find . -type f -name myfile
此命令将在当前目录及其子目录中运行搜索以查找名为myfile. 该选项-type f要求它仅查找文件,单点.表示当前目录。
让我们看看 find 命令的一些实际示例。
按名称查找文件和目录
您可以按名称搜索文件和目录:
find . -name SEARCH_NAME
由于没有提到文件类型,它会搜索具有给定名称的文件和目录。
下面的示例查找名为 mystuff 的文件和目录:
abhishek@LHB:~/Examples$ find -name mystuff
./new/mystuff
./mystuff
仅查找文件或仅查找目录
如果只想查找文件,请指定文件类型 -f:
find . -type f -name SEARCH_NAME
类型和名称的顺序无关紧要。以前面的例子为例,只查找文件:
abhishek@LHB:~/Examples$ find -type f -name mystuff
./mystuff
如果只想搜索目录,请指定类型 -d:
find . -type d -name SEARCH_NAME
在上一个文件中,仅查找目录:
abhishek@LHB:~/Examples$ find -type d -name mystuff
./new/mystuff
运行不区分大小写的搜索
默认情况下,find 命令区分大小写。您可以使用-iname代替使用给定名称运行不区分大小写的搜索-name。
find . -type f -iname SEARCH_NAME
你也可以使用它type d。
abhishek@LHB:~/Examples$ find -iname mystuff
./new/mystuff
./MyStuff
./mystuff
以上三个例子截图:
按扩展名搜索文件(重要)
find 命令最常见的用途之一是查找特定类型的文件,或者我应该说是特定的扩展名。
例如,假设您要搜索当前目录中的所有 C++ 文件。C++ 文件以扩展名 .cpp 结尾,因此您可以这样搜索:
find . -type f -name "*.cpp"
通过这种方式,您可以告诉 find 命令查找type file以.cpp.
abhishek@LHB:~$ 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 将扩展通配符。
如果您不将搜索词括在引号中:
find . -type f -name *.cpp
您的 shell 将展开 *.cpp 并将其替换为当前目录中名称以 .cpp 结尾的所有文件。
如果只有一个文件,这可能会起作用,但如果有多个文件,您的 shell 会抱怨语法不正确。
在上面的例子中,只有一个 cpp 文件,因此当命令扩展为 时find . -type f -name file.cpp,它file.cpp仍然有效,因为它仍然可以作为搜索词。
但是在同一目录中有两个 .txt 文件,因此当命令扩展到 时find . -type f -name another.txt new.txt,它会抱怨,因为现在有多个搜索词。
这就是为什么您应该始终将搜索词括在双引号中的原因。
搜索具有多个扩展名(或条件)的多个文件
上面的命令搜索具有给定扩展名的文件。如果您想查找具有不同扩展名的文件怎么办?
使用-o作为逻辑 OR 条件的选项运行一次,而不是多次运行 find 命令:
find . -type f -name "*.cpp" -o -name "*.txt"
下面是一个例子:
abhishek@LHB:~/Examples$ 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
在特定目录中查找文件
到目前为止,所有示例都在当前目录中执行搜索,因为您指定了 . 在示例中。
点可以替换为目录的绝对或相对路径,以便您可以在指定目录中查找文件而无需离开当前位置。
abhishek@LHB:~/Examples$ 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 参数执行的搜索找到大文件或小文件,这仅适用于文件,不适用于目录。
您可以使用-size带有 +N的选项来表示大于 N 的大小,使用带有 -N的选项来表示小于 N 的大小。
查找大小正好为 50 KB 的文件:
find . -size 50k
要在当前目录中搜索大于 1 GB 的文件:
find . -size +1G
要查找小于 20 字节的内容:
find . -size -20c
要查找大于 100 MB 但小于 2 GB 的文件:
find . -size +100M -size -2G
您也可以将尺寸搜索与名称搜索结合起来,例如,要在根目录中搜索名称以 .log 结尾但大小大于 500 MB 的所有文件,您可以使用:
find / -size +500M -name "*.log"
- c : 字节
- k: 千字节
- M: 兆字节
- G: 千兆字节
查找最近修改的文件(根据修改或创建时间搜索)
- mtime:文件最后修改时间
- ctime:文件的创建时间
- atime:文件的最后访问时间
您经常会发现自己想要查找所有最近修改过的文件。在这种情况下,按修改时间搜索会有所帮助。
要查找 3 天内(3*24H)修改的所有文件,请使用:
find . -type f -mtime -3
要查找至少 5 天(5*24H)前创建的所有文件,请使用:
find . -type f -ctime +5
我知道 24 小时是一个巨大的时间框架,如果您想搜索几分钟前修改过的文件怎么办?
为此,您可以使用mmin,amin和cmin。
要查找过去 5 分钟内修改过的所有文件,请使用:
find . -type f -mmin -5
您可以指定上限和下限以及搜索名称。下面的命令将搜索过去 20 到 30 分钟内修改过的所有 .java 文件。
find . -type f -mmin +20 -mmin -30 -name "*.java"
查找具有特定文件权限的文件
我希望您熟悉Linux 中的文件权限概念。
find 命令允许您搜索具有特定文件权限和访问模式的文件。
find -perm mode
例如,查找当前目录下所有访问方式为777的文件;
find . -perm 777
要查找所有具有读写访问权限的文件(完全匹配,如果文件对所有人具有执行权限,则不匹配):
find . -perm a=r+w
查找用户拥有的文件
您还可以根据所有权搜索文件。
例如,要在当前目录中查找用户 John 拥有的文件,请使用:
find . -type f -user John
您还可以将其与其他选项(如大小、时间和名称)结合使用:
find . -type f -user John -name "*.cpp"
不递归查找,只在当前目录中查找
默认情况下, find 命令在您当前位置的所有子目录中搜索,如果您不想这样做,您可以将搜索深度指定为 1。这会将搜索限制为仅当前目录并排除任何子目录。
find . -maxdepth 1 -type f -name "*.txt"
从搜索中排除目录
如果你想从搜索中排除一个目录,你可以通过组合路径、修剪和逻辑或来做到这一点。
find . -path "./directory_exclude/*" -prune -o -name SEARCH_NAME
小心目录路径中的 *,路径-prune后和-o修剪后。
基本上,prune 命令要求不使用路径指定的值。修剪始终用于-o确保仅对未修剪的目录评估术语的右侧。
对查找命令(exec 和 xargs)的结果采取行动
到目前为止,您已经了解了根据各种条件查找文件的各种方法。那挺好的,但是您可以通过对 find 命令的结果采取某些操作来使其更好。
例如,查找匹配特定名称模式的文件并一次重命名它们或查找空文件并删除它们如何?
您知道管道重定向可用于将一个命令的输出与另一个命令的输入组合起来。但这不适用于 find 命令的输出,至少不能直接使用。
如果您想对 find 命令的结果采取行动,您有两个选择:
- 使用 exec
- 使用 xargs
使用查找和执行
假设您想使用 find 命令长列表 (ls -l) 搜索文件。这是你使用的:
find . -type f -name "*.txt" -exec ls -l {} +
这是输出:
abhishek@LHB:~/Examples$ find . -type f -name "*.txt" -exec ls -l {} +
-rw-rw-r-- 1 abhishek abhishek 39 Oct 13 19:30 ./another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir1/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 15:36 ./new/dir2/another.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:51 ./new/mystuff/new.txt
-rwxrwxrwx 1 abhishek abhishek 35 Oct 13 15:37 ./new/new.txt
-rw-rw-r-- 1 abhishek abhishek 35 Oct 13 18:16 ./new.txt
许多人忘记{} +在 exec 命令的末尾添加。您必须使用它并注意 {} 和 + 之间的空格。
{} 是引用 find 命令结果的内容。你可以把它想象成 {file 1, file 2, file 3}。该+符号用于终止 exec 命令。
还有另一个与 exec 的约定:
find . -type f -name *.txt" -exec ls -l {} \;
这里, ; 用于代替 + 符号。之前的附加; 用于转义特殊字符;。
的优点{} +是能够运行命令数量ls -l file1 file2 file3,而{} ;将运行ls -l file1,ls -l file2等等。
但是,{} ;具有{}在同一个 exec 语句中使用多次的优点,例如,下面的命令将使用 .old 扩展名重命名所有找到的文件。
find . -type f -name *.txt" -exec mv {} {}.old \;
使用 xargs
许多 Linux 用户习惯了管道重定向。这个带有尾随的 exec 命令{} +对他们来说似乎很吓人。
这是 xargs 帮助的地方,您只需通过管道将 find 命令的输出解析为xargs 命令。
find . -type f -name *.txt" | xargs ls -l
语法看起来简单多了,对吧?Xargs 命令也很强大。
结合 find 和 grep
现在您了解了将 find 与 xargs 和 exec 命令结合使用,您可以使用它来组合 find 和 grep。
对于任何系统管理员或软件开发人员,find 和 grep 是最常见但最有用的组合之一。
您使用 find 搜索文件名模式,然后使用 grep 搜索这些文件中的内容。
例如,您要搜索包含术语 Alice 的所有 .txt 文件。您可以像这样组合 find 和 grep:
find . -type f -name "*.txt" -exec grep -i alice {} +
使用 xargs 也可以实现相同的效果:
find . -type f -name "*.txt" | xargs grep -i alice
当然,这是最简单的示例,但如果您熟悉grep 命令,则可以根据自己的喜好和需要使用它。
find还有很多……
并且不可能列出所有的 find 命令选项和示例,可能性是无限的,但是当您熟悉 find 命令时,您可以开始在各种情况下使用它。这真的取决于你如何结合这里的逻辑。
相关推荐
- 全新架构!腾讯推出基于NT架构的全新Linux版QQ
-
据之前的报道,QQ作为经典的聊天软件在经历多次的功能调整后,正式选择基于新技术开发新版本的QQ。而在今日,基于NT架构的全新QQLinux版已结束内测,并正式为其推出官网新界面,并为所有用户提供下载...
- Linux系统区别英文字母大小写(linux是否区分大小写)
-
我们一般在Windows系统开发程序并进行功能测试,如果上线的时候选择Windows服务器的话,是什么问题都没有。但是当选择Linux系统的时候,就必须注意Linux系统是严格的区别文字大小。Wind...
- 微软赞助LinuxCon北美峰会:向Linux表达爱意
-
IT之家讯8月24日消息,LinuxCon北美峰会在美国西雅图举行,与往年相比本次峰会最大的亮点是:微软作为赞助商出席了峰会,再次向世人宣布“微软爱Linux”。在本次峰会中,微软为大家准备了印有“...
- 现在越来越注重知识产权,你在设计中有知道哪些字体是可商用吗?
-
在设计海报中字体是很重要的一部分,近年来知识产权的越来越注重,不少设计公司用了有版权字体踩坑也时常可见。那么我们怎样去区别字体有没有版权呢。(文章结尾有文章领取方法)1.Windows库中自带的字体...
- Linux 快速安装当前目录及子目录下的所有字体
-
源码随时更新sh/fonts-install.sh·main·JetsungChan/sh-files·极狐GitLabsh-files/fonts-install.shatma...
- 开源字体编辑器TruFont(开源字体库)
-
TruFont是一款跨平台的开源字体编辑器,它支持.otf、.ttf、.ttx、.pfa、.pfb、.woff等字体格式。支持Linux、MacOSX、以及Windows平台。htt...
- 告别字体侵权,100+个免费可商用字体大集合(附字体包)
-
作为设计师,我们在作图时要使用大量的字体来达到我们想要的效果,但是字体都是有版权的,据说前几年暴风、保洁被方正告,赔了几百上千万(我的天呐,吓死宝宝了)最近,在群里看到了又有人收到律师函,去年底我也收...
- 办公小技巧:告别侵权 PPT字体自己造
-
很多朋友还不知道,我们每天面对的字体都是有版权保护的,如果对这方面的内容不了解,一不小心就可能造成侵权。那么我们在日常设计PPT文稿的时候,如何避免字体侵权呢?首先我们得懂得如何查看版权信息,另外还需...
- 在linux中添加Windows字体(linux使用windows字体)
-
linux中添加字体第一步:WINDOWS/FONTS中的字体文件,上传到linux服务器上/usr/share/fonts/myfonts第二步:将copy到的字体文件夹copy到系统字体文件夹中并...
- 在Ubuntu系统中如何更换字体(ubuntu如何调整字体大小)
-
在Ubuntu中,默认情况下已经安装了很多字体,但是可能有一段时间你需要安装一些额外的字体。本文介绍如何在Ubuntu18.04中安装字体。环境Ubuntu18.04.3LTS下载并解压字体首先...
- 在麒麟Linux上安装Elasticsearch的步骤
-
在麒麟Linux上安装Elasticsearch的步骤如下,分为基于Debian(如Ubuntu)和基于RPM(如CentOS)的两种常见场景。请根据你的麒麟Linux版本选择对应的安装方式:1.系...
- Linux实战之:version `GLIBC_2.27' not found
-
通过ldd命令查看缺失的依赖,发现有个插件一直提示:“/lib/x86_64-linux-gnu/libm.so.6:version`GLIBC_2.27'notfound”,通过ap...
- 32、64位版本!揭Ubuntu 14.10系统性能
-
1Ubuntu14.10新平台性能比拼从phoronix.com的消息获悉,Ubuntu的支持人BryanQuigley正在考虑将Ubuntu16.04作为最后一个32位发行版本。2016年4月...
- Ubuntu 25.04内核确定,Linux 6.14带来全新体验
-
IT之家12月14日消息,Canonical工程师TimoAaltonen昨日(12月13日)在Ubuntu论坛发帖,确认Ubuntu25.04发行版将使用Linux...
- 2020年最漂亮的7个Linux发行版(最新linux发行版)
-
请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言对于想学习Linux的朋友们,心中一定有疑问,哪个Linux版本比较好入门,Li...
- 一周热门
- 最近发表
- 标签列表
-
- linux 远程 (37)
- u盘 linux (32)
- linux 登录 (34)
- linux 路径 (33)
- linux 文件命令 (35)
- linux 是什么 (35)
- linux 界面 (34)
- 查看文件 linux (35)
- linux 语言 (33)
- linux代码 (32)
- linux 查看命令 (33)
- 关闭linux (34)
- root linux (33)
- 删除文件 linux (35)
- linux 主机 (34)
- linux与 (33)
- linux 函数 (35)
- linux .ssh (35)
- cpu linux (35)
- 查看linux 系统 (32)
- linux 防火墙 (33)
- linux 手机 (32)
- linux 镜像 (34)
- linux mac (32)
- linux ip地址 (34)