Find 是一个非常强大的命令,用于在 Linux 系统上搜索您想要的任何内容。
默认情况下,它在指定目录及其所有子目录中搜索。
你可能并不总是想要那个。 您可以通过从 find 命令搜索中排除目录来优化搜索。
在本教程中,我将展示在使用 find 命令时排除目录的各种方法。
方法 1:使用 prune 选项
首先,让我介绍一下您将如何使用带有 prune 选项的 find 命令:
find [path] -path [directory to exclude] -prune -o -print
为了 example,我创建了一个名为 prune
其中包含以下文件和目录:
那么如何排除 music
执行搜索时的目录?
find /home/sagar/prune -path /home/sagar/prune/music -prune -o -print
如您所见,它仅通过 text 和 images 目录,因为我排除了第 3 个目录。
排除多个目录
很容易吧? 但是当你想要的时候呢 排除多个目录? 这可以很容易地使用 -o
操作员。
为了 example,我将排除音乐和文本目录:
find . ( -path ./music -prune -o -path ./text -prune ) -o -print

简单来说,您必须将目录与 -prune
和 -o
里面 ()
如图所示排除多个目录。
但是 find 不仅限于搜索文件,而且当与 exec 配对时,可以执行 scipts、程序甚至是输出命令:
方法 2:使用 not 运算符
与我上面解释的相比,使用 not 运算符很容易,因为语法很容易掌握:
find [path] -type f -not -path '*/directory to exclude/*'
为了 example,让我们排除 music
使用 not 运算符的目录:
find . -type f -not -path '*/music/*'

如您所见,搜索结果不包括任何与音乐目录相关的文件。
方法 3:使用 ! 操作员
在搜索时排除目录的另一种简单方法是使用 !
操作员。
语法类似于我上面解释的,但长度有点短:
find /path/ -type f ! -path '*/directory to exclude/*'
假设我想排除一个名为 text 的目录,所以我的命令是:
find . -type f ! -path '*/text/*'

但事实并非如此。 作为最广泛的命令之一,find 还可以根据修改时间搜索文件。
额外提示:在 find 命令中排除子目录
好吧,这有点不同,因为本节将使用称为 search depth
.
这意味着我将指定 find 实用程序的搜索深度。 在这里,深度是指文件系统的层。 文件系统的一般结构如下所示:

您可以使用 maxdepth
和 mindepth
选项。
因此,当您使用 maxdepth 时,您会限制 find 实用程序,或者简单地说, 你是说“不要超过这个限制”。
尽管 mindepth 是关于从哪里开始搜索 并将在每一层查找每个可用文件。
因此,假设我想搜索第一层可用的文本文件,因此我将使用 maxdepth 来控制搜索:
find . -maxdepth 1 -type f -name "*.txt"

但是,如果您想搜索位于中间的特定层怎么办? 嗯,这就是 mindepth
来玩!
假设我想专门在 Images 目录(第 2 层)内搜索 PNG 图像,所以我将使用 maxdepth 和 mindepth to 2 强制 find 搜索特定目录。
find . -maxdepth 2 -mindepth 2 -type f -name "*.png"

有创意 maxdepth
和 mindepth
并且您将能够立即搜索特定文件!
最后的话
这是我对如何在通过各种方法搜索文件时排除目录的看法,如果您仍有任何疑问,请随时在评论中提问。