如何在 Linux 终端高效搜索文件——高级指南
如果你是第一次学习 find
命令,我在之前的教程中介绍了文件搜索的基础知识,并探讨了一些使用 Linux 快速搜索文件的强大命令。如果你没有读过,而且还不熟悉 find
,我强烈建议你先看一下,然后再回来这里。
如何搜索某个用户拥有的文件
find
命令接受一个名为 user
的特殊参数,你可以用它来过滤一个用户拥有的文件。
语法是这样的:
代码语言:javascript复制find [path] -user [username] [options]
假设你想搜索我拥有的所有文件(我在这台笔记本上的用户名是 aruna
)。你可以通过使用下面的命令来做到这一点:
find ./5minslearn/ -user aruna
搜索一个用户拥有的文件
上面的命令将列出 5minslearn
目录下用户 aruna
拥有的所有文件。
你可能注意到在语法的末尾加入了 [options]
。这意味着你可以在后面添加任何参数,使你的搜索更有效一些。
例如,让我们试着只过滤我拥有的目录。要过滤这些目录,你必须添加 -type
选项。下面是它的命令:
find ./5minslearn/ -type d -user aruna
一个用户创建的文件目录
从上面的截图中,你可以看到这个命令列出了 5minslearn
目录下由我拥有的所有目录和子目录。
如何搜索有特定权限的文件
使用 -perm
参数,你可以搜索有特定权限的文件。
语法是这样的:
代码语言:javascript复制find [path] -perm [permissions] [options]
例如,我们假设你想搜索当前目录中所有具有只读权限的文件。只读文件的代码是 400
。
**注意:**如果你不知道这个代码(400
)是如何产生的,而你又很想知道,请参考我的《Linux 文件权限》文章中的“如何使用八进制模式删除权限”。
find . -perm 400
查找具有只读权限的文件
我很久以前创建了这个 welcome.txt
文件,它具有只读权限。你可以从上面的截图中看到,find
命令已经完全识别了它。
我想分享一下我在工作中遇到的一个奇怪的经历。
我当时正在做一个项目,其中包含大量的压缩文件(大约 200 多个)。在这些文件中,我必须找到所有没有只读权限的文件。我很确定,这个数量很小,我可以用一只手来数。
在 200 多个文件中寻找最多 5 个文件是一个耗时的过程。因此,我决定找一个替代方法。
我在谷歌上搜索了一下,结果让我很吃惊。
我了解到,只要在 -perm
命令前加上一个 -not
标志,就可以做到这一点。下面是这个命令,供你参考:
find . -not -perm 400
该命令将列出当前目录中所有不具有只读权限的文件。
找到所有不具有只读权限的文件
另外一个好处是,你可以在 find
命令中的任何选项前加上这个 -not
标志,以查找与搜索查询相反的内容。
这里是另一个例子:
代码语言:javascript复制find . -not -type f
运行上述命令将列出当前目录中所有非文件的项目(目录、符号链接等)。
如何搜索属于某个特定组的文件
正如我们在上一篇关于文件权限的教程中所看到的,可能会有多个人因工作而共享一台机器。他们被分组为开发者、QA 和其他人。
那么,如果你想找到开发人员组的人 Developers
可以查看的所有文件呢?这很困难,对吗?
不要担心,这里有一个使用 find
命令的简单替代方法。
使用 find
命令中的 -group
参数,你可以搜索属于某个组的所有文件。
语法是这样的:
代码语言:javascript复制find [path] -group [groupname] [options]
我的机器上有一个带有我名字的组。让我们试着找到我的组所拥有的所有文件。
代码语言:javascript复制find . -group aruna
find
命令列出属于一个组的所有文件
你也可以把 -group
选项和其他 find
命令选项结合起来,以完善你的搜索。
例如,你可以将 -group
选项与 -perm
选项结合起来,搜索属于某个组并有特定权限的文件。
find . -group aruna -perm 400
查找属于一个组且具有只读权限的所有文件
上述命令将列出属于 aruna
组的所有只读文件。
同样,正如我前面提到的,你也可以把 -group
选项和 -not
选项结合起来,找到不属于某个特定组的文件。
让我们试着找到不属于 sudo
组的文件。
find . -not -group sudo
查找不属于 sudo
组的文件
如何搜索最近修改过的文件
find
命令中的 -newer
选项可以搜索在给定文件的最后一次修改之后修改的文件。
语法是这样的:
代码语言:javascript复制find [path] -newer [reference_file]
例如,如果你想搜索所有在 notes.txt
文件之后修改的文件,你可以使用以下命令:
find . -newer notes.txt
该命令将搜索当前目录中所有在 notes.txt
文件之后最近被修改的文件。
查找最近被修改的文件
如何搜索几分钟前被访问过的文件
要搜索几分钟前访问过的文件,你可以使用 -amin
参数。这个参数将接受分钟数(n
),并找到所有在 n
分钟前被访问的文件。
语法如下:
代码语言:javascript复制find [path] -amin [n] [options]
例如,让我们尝试找到在过去 30 分钟内被访问的文件:
代码语言:javascript复制find . -amin -30
查找在过去 30 分钟内被访问的文件
我希望你注意到数字前面的负(minus)符号。它表明该文件在过去被访问过。
如何搜索所有空文件
你可以使用 find
命令中的 -empty
标志来搜索空的文件和目录。
语法是这样的:
代码语言:javascript复制find [path] -empty [options]
要搜索所有空文件和目录,你可以使用以下命令:
代码语言:javascript复制find . -empty
查找所有空文件和目录
要想只搜索空目录,你可以把 -empty
选项和 -type
选项结合起来:
find . -type d -empty
查找所有空目录
这个命令将列出当前目录中所有的空目录。
可以在 -empty
标志后面加上 -delete
标志来删除所有的空文件和文件夹。
如何搜索符合特定正则表达式的文件
-regex
参数允许你使用正则表达式(RegEx)来应用一个过滤器。
语法是这样的:
代码语言:javascript复制find [path] -regex [expression] [options]
例如,我们假设你想搜索名字以字母 w
开头的文件,你可以使用下面的命令来实现这一目的:
find . -regex "./w.*"
查找所有匹配特定正则表达式的文件
总结
在这篇文章中,你已经学到了一些高级技巧,可以有效地搜索文件并对其进行各种操作。
我建议你通过尝试来学习 find
命令。自己想出一些方案,并尝试使用你所学到的技巧来查找文件。
在此为你抛出几个场景:
- 查找并删除以
.txt
结尾的文件 - 查找不属于你的文件
- 查找与某一模式不匹配的文件
- 查找所有以
log-
开头、大小在 50MB 和 100MB 之间的文件 - 查找属于某个组且 10 分钟前被访问的所有文件
参考:如何在 Linux 终端高效搜索文件——高级指南