如何在 Linux 中使用 FIND

通过正确的参数,FIND 命令是一种在您的系统中查找数据的强大且灵活的方式。
295 位读者喜欢这篇文章。
How to upgrade your Fedora Linux system with DNF

Opensource.com

最近的一篇 Opensource.com 文章中,Lewis Cowles 介绍了 find 命令。

find 是日常工具箱中功能最强大和灵活的命令行程序之一,因此值得花更多时间研究它。

至少,find 需要一个路径来查找东西。 例如

find /

将会查找(并打印)系统上的每个文件。 由于一切都是文件,您将获得大量输出需要筛选。 这可能无助于您找到您正在寻找的东西。 您可以更改路径参数来稍微缩小范围,但它仍然不如使用 ls 命令更有帮助。 因此,您需要考虑您要查找的内容。

也许您想找到您主目录中的所有 JPEG 文件。 -name 参数允许您将结果限制为与给定模式匹配的文件。

find ~ -name '*jpg'

但是等等! 如果其中一些具有大写扩展名怎么办? -iname 类似于 -name,但它不区分大小写。

find ~ -iname '*jpg'

太棒了! 但是 8.3 命名方案太老了,是 1985 年的。 一些图片可能具有 .jpeg 扩展名。 幸运的是,我们可以使用 -o 表示的“或”来组合模式。

find ~ ( -iname 'jpeg' -o -iname 'jpg' )

我们越来越接近了。 但是如果你有一些以 jpg 结尾的目录怎么办? (我无法理解你为什么将一个目录命名为 bucketofjpg 而不是 pictures 。) 我们可以使用 -type 参数修改我们的命令 仅查找文件。

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f

或者,也许您想找到那些命名奇怪的目录,以便以后可以重命名它们

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d

事实证明您最近拍摄了很多照片,因此让我们将其缩小到最近一周内更改的文件。

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7

您可以根据文件状态更改时间 (ctime)、修改时间 (mtime) 或访问时间 (atime) 进行时间过滤。 这些以天为单位,因此如果您想要更精细的控制,您可以改用分钟来表示(分别为 cminmminamin)。 除非您确切知道您想要的时间,否则您可能会在数字前加上 +(大于)或 (小于)。

但也许您不关心您的照片。 也许您的磁盘空间不足,因此您想找到 log 目录中所有巨大的(让我们将其定义为“大于 1 GB”)文件

find /var/log -size +1G

或者,也许您想找到 /data 中 bcotton 拥有的所有文件

find /data -owner bcotton

您还可以根据权限查找文件。 也许您想找到您主目录中所有世界可读的文件,以确保您没有过度共享。

find ~ -perm -o=r

这篇文章只触及了 find 可以做的功能的表面。 将测试与布尔逻辑结合使用可以为您提供令人难以置信的灵活性,以准确地找到您正在寻找的文件。 并且通过像 -exec-delete 这样的参数,您可以让 find 对它所... 找到的东西采取行动。 有没有喜欢的 find 表达式? 在评论中分享它们!

标签
User profile image.
Ben Cotton 是一名训练有素的气象学家,但天气是一个很棒的爱好。 Ben 在 Red Hat 担任 Fedora 项目经理。 他是《开源项目项目管理》的作者。 在 Twitter (@FunnelFiasco) 或 FunnelFiasco.com 上找到他。

12 条评论

感谢您撰写这篇文章,Ben。 find 命令总是让我感到有些困惑(嗯,比一点点多一点)。 这篇文章澄清了一切。

很高兴你喜欢它,Scott。 `find` 就像一个洋葱:总有另一层需要剥开并发现。 如果你不小心,它会让你哭泣。

回复 by ScottNesbitt

$ find ~ ( -iname 'jpeg' -o -iname 'jpg' )
bash: 语法错误:意外标记 `(' 附近

知道这里有什么问题吗? 使用 " 也不行。

此外,您的网站不接受以 caramail.fr 结尾的电子邮件地址。 真好。

您需要使用反斜杠转义括号,否则 shell 会尝试将其解释为要在子shell中运行的命令组。

我会让网站管理员知道电子邮件域问题。 感谢您告知我们。

回复 by student (未验证)

谢谢 Ben,这确实有效。 我看到你更新了文章。

问题在于我的电子邮件地址后面有一个空格,导致它被标记为无效。 我花了一段时间才弄清楚。 删除空格后,我可以发布。 ;)

回复 by bcotton

嗨,student,

我认为电子邮件被阻止是因为我们的 Drupal 平台无法将其识别为标准电子邮件格式。 我将对此进行调查,看看情况是否确实如此。

Jason

回复 by student (未验证)

感谢你的链接 Ben,以及后续的跟进。 我经常使用 find,我希望我们可以帮助人们转向 Linux 和 Find 命令,而不是我经历过的一些糟糕的 GUI 体验。

很棒的文章,Ben! 我经常将 find 与 grep 结合使用,例如

find . -name \*.java -exec grep -l System.err {} \; -print

将列出所有包含字符串 System.err 的 *.java 文件名

我最喜欢的 find 表达式是将它与 grep(1) 结合使用,如下所示
$ grep "aWord" `find . -name "*.c"`

不错。 我通常将 grep 放在 find 命令中,并使用 -exec 选项,如下所示

find . -name "*.c" -exec grep "aWord" \{\} \;

:D

回复 by mtsouk

此外,我总是使用 "find ... -exec grep ..." 方法来执行递归搜索,但它不会显示文件名。 您可以通过执行 "... grep aWord {} /dev/null \;" 来修复它。 但 Mihalis 的 "grep aWord `find . -name \*.txt`" 方法是一种更短的实现相同目标的方法。

例外情况是当一个或多个文件名包含空格时。 在这种情况下,"find ... -exec grep ..." 将起作用,而 "grep ... `find ...`" 将失败。 有趣!!

回复 by mtsouk

Willem,您可以通过将 "-print" 附加到命令中,使用 find... -exec grep ... 查看文件名。 如果 "-exec grep" 部分成功,则 "-print" 部分会导致打印文件名。

回复 by Willem van Schaik (未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.