如何在 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 在红帽公司担任 Fedora 项目经理。他是《开源项目项目管理》的作者。在 Twitter (@FunnelFiasco) 或 FunnelFiasco.com 上找到他。

12 条评论

感谢 Ben 撰写这篇文章。find 命令总是让我有点困惑(好吧,不止一点)。这篇文章澄清了一切。

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

回复 作者:ScottNesbitt

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

知道这里有什么问题吗?使用双引号也不起作用。

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

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

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

回复 作者:student (未验证)

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

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

回复 作者:bcotton

嗨 student,

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

Jason

回复 作者: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

回复 作者:mtsouk

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

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

回复 作者:mtsouk

Willem,您可以通过在命令中附加“-print”来查看带有 find... -exec grep ... 的文件名。如果“-exec grep”部分成功,则“-print”部分会导致打印文件名。

回复 作者:Willem van Schaik (未验证)

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