使用查找命令时排除目录

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
使用 find 命令排除多个目录从查找搜索中排除多个目录

简单来说,您必须将目录与 -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/*'
在 find 命令中使用 not 选项排除目录

如您所见,搜索结果不包括任何与音乐目录相关的文件。

方法 3:使用 ! 操作员

在搜索时排除目录的另一种简单方法是使用 ! 操作员。

语法类似于我上面解释的,但长度有点短:

find /path/ -type f ! -path '*/directory to exclude/*'

假设我想排除一个名为 text 的目录,所以我的命令是:

find . -type f ! -path '*/text/*'
使用 ! 排除目录查找命令中的运算符

但事实并非如此。 作为最广泛的命令之一,find 还可以根据修改时间搜索文件。

额外提示:在 find 命令中排除子目录

好吧,这有点不同,因为本节将使用称为 search depth.

这意味着我将指定 find 实用程序的搜索深度。 在这里,深度是指文件系统的层。 文件系统的一般结构如下所示:

linux文件系统

您可以使用 maxdepthmindepth 选项。

因此,当您使用 maxdepth 时,您会限制 find 实用程序,或者简单地说, 你是说“不要超过这个限制”。

尽管 mindepth 是关于从哪里开始搜索 并将在每一层查找每个可用文件。

因此,假设我想搜索第一层可用的文本文件,因此我将使用 maxdepth 来控制搜索:

find . -maxdepth 1 -type f -name  "*.txt"
搜索时使用 maxdepth 和 find 排除目录

但是,如果您想搜索位于中间的特定层怎么办? 嗯,这就是 mindepth 来玩!

假设我想专门在 Images 目录(第 2 层)内搜索 PNG 图像,所以我将使用 maxdepth 和 mindepth to 2 强制 find 搜索特定目录。

find . -maxdepth 2 -mindepth 2 -type f -name  "*.png"
将 maxdepth 和 mindepth 与 find 命令一起使用

有创意 maxdepthmindepth 并且您将能够立即搜索特定文件!

最后的话

这是我对如何在通过各种方法搜索文件时排除目录的看法,如果您仍有任何疑问,请随时在评论中提问。