如何在 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 命名方案已经过时了。有些图片可能具有 .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` 就像洋葱:总是有另一层可以剥开并发现。如果你不小心,它会让你哭泣。

回复 ,作者:ScottNesbitt

$ find ~ ( -iname 'jpeg' -o -iname 'jpg' )
bash: syntax error near unexpected token `('

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

另外,您的网站不接受以 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 (未验证)

© . All rights reserved.