原文: How to Search Files Effectively in the Linux Terminal – Advanced Guide

大家好!感谢大家对我的 find 命令基础知识教程的精彩反馈。很多人看了文章之后,让我写一个关于 find 命令的更高级版本。

就是这篇!现在,是时候把你的技能提高到新的水平了。在这篇文章中,让我们来探讨 find 命令的更高级版本。

如果你是第一次学习 find 命令,我在之前的教程中介绍了文件搜索的基础知识,并探讨了一些使用 Linux 快速搜索文件的强大命令。如果你没有读过,而且还不熟悉 find,我强烈建议你先看一下,然后再回来这里。

如何搜索某个用户拥有的文件

find 命令接受一个名为 user 的特殊参数,你可以用它来过滤一个用户拥有的文件。

语法是这样的:

find [path] -user [username] [options]

假设你想搜索我拥有的所有文件(我在这台笔记本上的用户名是 aruna)。你可以通过使用下面的命令来做到这一点:

find ./5minslearn/ -user aruna
image-37
搜索一个用户拥有的文件

上面的命令将列出 5minslearn 目录下用户 aruna 拥有的所有文件。

你可能注意到在语法的末尾加入了 [options]。这意味着你可以在后面添加任何参数,使你的搜索更有效一些。

例如,让我们试着只过滤我拥有的目录。要过滤这些目录,你必须添加 -type 选项。下面是它的命令:

find ./5minslearn/ -type d -user aruna
image-38
一个用户创建的文件目录

从上面的截图中,你可以看到这个命令列出了 5minslearn 目录下由我拥有的所有目录和子目录。

如何搜索有特定权限的文件

使用 -perm 参数,你可以搜索有特定权限的文件。

语法是这样的:

find [path] -perm [permissions] [options]

例如,我们假设你想搜索当前目录中所有具有只读权限的文件。只读文件的代码是 400

注意:如果你不知道这个代码(400)是如何产生的,而你又很想知道,请参考我的《Linux 文件权限》文章中的“如何使用八进制模式删除权限”。

find . -perm 400
image-39
查找具有只读权限的文件

我很久以前创建了这个 welcome.txt 文件,它具有只读权限。你可以从上面的截图中看到,find 命令已经完全识别了它。

我想分享一下我在工作中遇到的一个奇怪的经历。

我当时正在做一个项目,其中包含大量的压缩文件(大约 200 多个)。在这些文件中,我必须找到所有没有只读权限的文件。我很确定,这个数量很小,我可以用一只手来数。

在 200 多个文件中寻找最多 5 个文件是一个耗时的过程。因此,我决定找一个替代方法。

我在谷歌上搜索了一下,结果让我很吃惊。

我了解到,只要在 -perm 命令前加上一个 -not 标志,就可以做到这一点。下面是这个命令,供你参考:

find . -not -perm 400

该命令将列出当前目录中所有不具有只读权限的文件。

image-40
找到所有不具有只读权限的文件

另外一个好处是,你可以在 find 命令中的任何选项前加上这个 -not 标志,以查找与搜索查询相反的内容。

这里是另一个例子:

find . -not -type f

运行上述命令将列出当前目录中所有非文件的项目(目录、符号链接等)。

如何搜索属于某个特定组的文件

正如我们在上一篇关于文件权限的教程中所看到的,可能会有多个人因工作而共享一台机器。他们被分组为开发者、QA 和其他人。

那么,如果你想找到开发人员组的人 Developers 可以查看的所有文件呢?这很困难,对吗?

不要担心,这里有一个使用 find 命令的简单替代方法。

使用 find 命令中的 -group 参数,你可以搜索属于某个组的所有文件。

语法是这样的:

find [path] -group [groupname] [options]

我的机器上有一个带有我名字的组。让我们试着找到我的组所拥有的所有文件。

find . -group aruna
image-41
find 命令列出属于一个组的所有文件

你也可以把 -group 选项和其他 find 命令选项结合起来,以完善你的搜索。

例如,你可以将 -group 选项与 -perm 选项结合起来,搜索属于某个组并有特定权限的文件。

find . -group aruna -perm 400
image-42
查找属于一个组且具有只读权限的所有文件

上述命令将列出属于 aruna 组的所有只读文件。

同样,正如我前面提到的,你也可以把 -group 选项和 -not 选项结合起来,找到不属于某个特定组的文件。

让我们试着找到不属于 sudo 组的文件。

find . -not -group sudo
image-7
查找不属于 sudo 组的文件

如何搜索最近修改过的文件

find 命令中的 -newer 选项可以搜索在给定文件的最后一次修改之后修改的文件。

语法是这样的:

find [path] -newer [reference_file]

例如,如果你想搜索所有在 notes.txt 文件之后修改的文件,你可以使用以下命令:

find . -newer notes.txt

该命令将搜索当前目录中所有在 notes.txt 文件之后最近被修改的文件。

image-44
查找最近被修改的文件

如何搜索几分钟前被访问过的文件

要搜索几分钟前访问过的文件,你可以使用 -amin 参数。这个参数将接受分钟数(n),并找到所有在 n 分钟前被访问的文件。

语法如下:

find [path] -amin [n] [options]

例如,让我们尝试找到在过去 30 分钟内被访问的文件:

find . -amin -30
image-45
查找在过去 30 分钟内被访问的文件

我希望你注意到数字前面的负(minus)符号。它表明该文件在过去被访问过。

如何搜索所有空文件

你可以使用 find 命令中的 -empty 标志来搜索空的文件和目录。

语法是这样的:

find [path] -empty [options]

要搜索所有空文件和目录,你可以使用以下命令:

find . -empty
image-46
查找所有空文件和目录

要想只搜索空目录,你可以把 -empty 选项和 -type 选项结合起来:

find . -type d -empty
image-47
查找所有空目录

这个命令将列出当前目录中所有的空目录。

可以在 -empty 标志后面加上 -delete 标志来删除所有的空文件和文件夹。

如何搜索符合特定正则表达式的文件

-regex 参数允许你使用正则表达式(RegEx)来应用一个过滤器。

语法是这样的:

find [path] -regex [expression] [options]

例如,我们假设你想搜索名字以字母 w 开头的文件,你可以使用下面的命令来实现这一目的:

find . -regex "./w.*"
image-48
查找所有匹配特定正则表达式的文件

总结

在这篇文章中,你已经学到了一些高级技巧,可以有效地搜索文件并对其进行各种操作。

我建议你通过尝试来学习 find 命令。自己想出一些方案,并尝试使用你所学到的技巧来查找文件。

在此为你抛出几个场景:

  • 查找并删除以 .txt 结尾的文件
  • 查找不属于你的文件
  • 查找与某一模式不匹配的文件
  • 查找所有以 log- 开头、大小在 50MB 和 100MB 之间的文件
  • 查找属于某个组且 10 分钟前被访问的所有文件

希望你喜欢阅读这篇文章!

要阅读更多此类有趣的博客,请在我的网站上订阅我的电子邮件通讯,并在社交媒体上关注我。