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

你是否曾经为在电脑上手动搜索文件而感到沮丧?如果你是一名开发人员或 DevOps 工程师,在没有 GUI 的 Linux 服务器上工作,来回浏览寻找文件会很困难。

很多人都不知道 Linux 终端的力量。Linux 有一个令人难以置信的强大的命令行,可以让你在几分之一秒内搜索文件和目录。

无论你是初学者还是专家,如果你想把你的文件管理技能提高到一个新的水平,你来到了正确的地方。这篇文章将帮助你了解 Linux 中最常用的 find 命令的基本知识。

Linux 中的 find 命令是什么

find 命令允许你在你的计算机上搜索文件和目录。它可以灵活地搜索特定目录中的文件,或通过所有子目录进行递归搜索。

让我们来探索 find 命令的力量。

如何按名称搜索文件

假设你在某个地方保存了一个叫 hello_world.html 的文件,你甚至不记得目录名称。但你的老板要求你立即把文件发给他们。

通常情况下,如果你忘记了你存储文件的位置,你会开始翻阅一个又一个文件夹,检查文件是否存在。

这时,find 命令就发挥了巨大的作用。与其在你的计算机上手动搜索文件,你可以使用 find 命令来自动完成这一过程。

通过使用 -name 标志传递文件的名称,find 命令搜索并返回文件的位置。

find -name <file_name>
按名称搜索文件的 find 命令语法
hUG1ogKlPIlvUZZiCIOBO4x1ZTlGAujhGTe2v-KevAi3zU3z-ZuBA0VJvMWht0V-7cLha4beNzMIkENiN0ZiYZfa8Pc0O-XJMzmbfftY_bo9Csrz-4-7dvwJFgC59G94A2GbFpPTkfU6rxL9MrSOCVI
按名称搜索文件的终端命令

但请记住,-name 标志执行的是大小写敏感的搜索。如果你想进行不区分大小写的搜索,你可以使用 -iname 标志来代替。

find -iname <file_name>
执行区分大小写的搜索的 find 命令语法
Gxuso3qZslePPLMxKDtBuQWwQiliDpU2pHAzRTdiRob2OBKrdN1oWA_rTwe2thYiHeUmRo8SBNE2QR6G2kmdDlKhX14wFd9fYmfppZVQNprUHaGMWLB_GgGVSq7l4DQyP2STSFZcx0Rt5B6thvM7T3Y
执行区分大小写的搜索的终端命令

在某些地方,你也可以用 find 命令来替代 ls 命令。我们假设你需要找到所有以 .txt 为扩展名的文件。你可以使用正则模式(*.txt)用 find 命令来实现。

find /path/to/search -name "*.txt"
find 命令搜素匹配正则的文件
xtbCKd-v83ytN4mnr35RbiWCgJuEiAt9LBO_Qq2IDwRPJaQWRfzBUe5YY63JEcLHS344TvGWRzK139n93upgh1ALKgRavsWwNe0iTh772rhGZwFXcpP5eyGz_iI6XPHuDK55Ch93rNe70fSIyJJcMmw
终端命令显示匹配正则模式的文件

这个命令将列出你当前目录及其子目录中的所有 .txt 文件。

如果要搜索某个特定目录和子目录中的 .txt 文件,你可以用你的目录的路径替换 /path/to/search

如何在 Linux 中搜索一个目录

通过在 find 命令中的 -type 参数中传递 d,可以搜索一个目录。

find /path/to/search -type d
搜索一个目录的 find 命令语法
image
终端命令使用 find 命令搜素一个目录

在上面的截图中,我们正在从我们的当前目录中查找一个名为 zip 的目录。

同样,-type 选项接受其他参数选项,以简化我们的查找过程。

  • f 查找常规文件的列表
  • b 查找块状设备的列表
  • c 查找字符设备的列表
  • l 查找符号链接的列表
  • s 查找套接字的列表
  • p 查找命名的管道

如何在 Linux 中按大小搜索文件

find 命令中加入 -size 选项可以帮助你根据大小来查找文件。在 size 前加一个 +-,分别代表大于和小于。

find /path/to/search -size <size_of_the_file>
按大小搜索文件的 find 命令语法
5_gYC6AREIU77iDWAOY3uqfyCEPpICXenMzpxMv15oaOyNg2t4QhtH862wZeIRH3IgWxX1MJYwAOMGQZVeerY6HeNYjcmB_bdMiqPnoAsSyQ5JjQ75DqmCOsbcLQ8AeMk31MQb9Z1aC0Q-1CznPNRn8
按大小搜索文件的终端命令

在上面的截图中,我们正在查找所有大小大于 1GB 的文件。

你也可以搜索属于特定大小范围内的所有文件。

例如,如果你想找到所有大于 50MB 和小于 100MB 的文件,你可以运行以下命令:

find /path/to/search -size +50M -size -100M
find 命令语法搜索在一个大小范围内的文件
KylER-ErURtFf22PtpPhqT8yQofvlaA6s7XhP8FdHo4KqLTXYsDY5EL3LhVoyZKrHJGMHYWJ6CheD2PiaS_ynX_x-Ziho5eqK8YbEAqdAVvugE0RUWuOPvuwrUddCIw4TnoqLZDSI2qRak1kdDF6o40
搜索在一个大小范围内的文件的终端命令

你可以用你喜欢的记号来指定大小。一些可用的符号是:

  • K 代表 KB
  • M 代表 MB
  • G 代表 GB
  • b 代表字节
  • c 代表块

如何根据修改时间来搜索一个文件

每个文件都有一个与之相关的创建和最后更新时间。让我们假设你的目录中有成千上万的文件。你在过去几天里编辑了一个文件,但忘记了它的名字。你肯定在那之后你只编辑了几个文件。

在这种情况下,你可以找到过去 7 天内修改过的所有文件。这将你的搜索从 1000 多个文件限制到一个更容易管理的数量。运行该命令后,你能在几秒钟内找到你编辑的文件。

这可以通过在 find 命令中传递 -mtime 参数来实现。

find /path/to/search -mtime <-number_of_days_ago>
find 命令语法搜索在某几天内修改过的文件
EOsirsBvBa83A2NeK1qGZ8g_FLriAngr4yso3nhOpuwT18zrkur92GKfMBfr8nA8ULrgdWvREvzJfSznVecNXZXONs3JXdG3gJFoqZ7PcqFmZe3T2IS0ka-bkSajpj3aXunMvTYYPZkLl4YjkYzx_1Y
根据修改时间来搜索文件的终端命令

让我们假设另一种情况,今天的日期是 2023 年 2 月 10 日。你在 2023 年 2 月 3 日之前修改了一个文件。2023 年 2 月 3 日之后,你修改了很多文件。你必须找到你在 2023 年 2 月 3 日之前修改的文件。所以,基本上,你需要 2023 年 2 月 3 日之前修改过的文件。

很奇怪的场景,对吗?

但是,你也可以使用 find 命令运行这个查询。你可以通过将负号(-)与正号(+)交换来实现。

下面是为你修改的命令:

find /path/to/search -mtime +7
find 命令语法搜索在某几天前修改过的文件

如何对从 find 命令中筛选出来的文件执行一个命令

这个问题可能会让你感到困惑。在揭晓答案之前,让我们通过一个真实的场景来清楚地了解这个问题。

假设你在一个目录中有 1000 个文件,运行 find 命令返回 20 个匹配文件。你想把这 20 个文件移到另一个目录中。你怎样才能实现这个目标呢?

简单地说,我们必须对每个被过滤的文件运行一个命令。

你可以通过在 find 命令中传递 -exec 选项来做到这一点。

-exec 选项对搜索中发现的每个文件执行一条命令。-exec 选项后面是一个命令和它的参数,其中的 {} 符号代表被处理文件的路径。

为了表示 -exec 命令的结束,我们必须添加 \;(一个反斜杠和一个分号)。

下面是语法:

find /path/to/search -name  -exec  {}  \;
find 命令语法对过滤的文件执行一个操作

让我们试着把过滤后的文件从 5minslearn 目录移到 zip 目录。

下面是命令:

find ./5minslearn -name "*.zip" -exec mv {} ./5minslearn/zip \;
Oysc8VJqcheOL0uSk9t18SM1BBckLmZ1Sfs026TByvdQcHNFVDGssztFu13rHi0waaOUXCuKx1rsHbyWCXr190agnVEKZA3rMexuSH_m6myz38JhQ563hNLBKfTBOMklTt-aH5dd05CfXCVwKG0yiZI

这个命令在 ./5minslearn 目录下搜索所有以 .zip 结尾的文件,然后将每个文件移到 ./5minslearn/zip 目录下。

-exec 选项允许你对找到的文件进行一系列的操作。你可以用复制、删除、甚至改变文件权限的命令来代替上面例子中的移动命令。

如何确认对过滤的文件执行命令

如果不确定是否在每个文件上应用操作,大多数人都会选择使用这个选项。

-ok 选项与 -exec 选项类似,只是它在对每个文件执行操作之前会要求确认。这个命令对于在执行具体操作之前审核将被影响的文件是超级有帮助的。如果你不确定或不希望应用该命令,你也可以选择拒绝。

例如,这次让我们试着把 .txt 文件移到其他目录。

find /path/to/search -name "*.txt" -ok mv {} /path/to/destination \;
find 命令语法在对过滤文件执行操作之前进行确认
LR9SFYz9f90xR6_aMS_VKEQa7IS9cecwEAMRkNh5KJ1JSMaQCx0cIe-5XOonpOOdELbnU8549XkQ-HfYCQEoG9Epn8F89cA86o3BRFTR9cJtOLM7GgvKpWMNpkutX89sRtWs96wZ0pz-JHZTSGFBrq0
终端命令在移动文件时进行确认

上述命令在 ./5minslearn 目录下搜索所有以 .txt 为扩展名的文件,然后在将每个文件移动到 ./5minslearn/text_files 目录前提示用户确认。

如果要批准该操作,请输入 yes,如果拒绝该操作,跳到下一个文件,则输入 no

当你想对你所修改的文件持谨慎态度时,-ok 选项很有用,因为它允许你在执行指定的命令前检查每个文件及其位置。

如何查找文件和详细信息

find 命令中的 -ls 选项用于显示搜索中发现的文件的信息,其格式与 ls 命令相同。这个选项提供了关于文件的详细信息,例如它们的权限、所有者、大小和最后修改时间。

find /path/to/search -name "*.<file-extension>" -ls
find 命令语法以 ls 命令形式列出文件
image-1
终端命令以 ls 命令形式列出文件

如何查找和删除文件

你是否曾经需要查找文件并将它们从你的电脑中删除?find 命令中的 -delete 选项可以帮你做到这一点。它允许你删除符合指定条件的文件。

find . -name "*.<extension>" -delete
W2DQEoEcNi0897Z99NPHyhx6RTPpO1hL0AVCAGCuKdabq8_eXbFtsL2BJdLn6MCqdYXTa7veSRhDj9gTU7Rbbz0vNoIbxF_N_IXmR45IHgH3DMXSnMBRPtLjIKK-G9af5FncqC2s28zqBfP6kcinXqY

在上面的例子中,你可以看到 find 命令删除了扩展名为 .html 的文件。

注意:这个操作是不可逆的。当你运行删除操作时,要 100% 确定。

我建议先运行 find 命令而不要使用 -delete 标志,确保只显示需要删除的文件。一旦你确定了,你就可以执行同样的命令,加上 -delete 标志。

总结

在这篇文章中,你学会了如何使用 Linux 终端有效地搜索文件。

这些是 find 命令中非常基本的选项,我认为每个开发者都应该知道。我相信掌握基础知识是掌握更高级的 Linux 的第一步。我在我所有的博客中都涵盖了基础知识,以帮助你打下坚实的基础。

要了解更多关于 Linux 的信息,请在我的网站上订阅我的电子邮件通讯,并在社交媒体上关注我。