如何在 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 千兆字节”)文件

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 中运行的命令组。

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

回复 作者:学生(未验证)

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

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

回复 作者:bcotton

嗨,学生,

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

Jason

回复 作者:学生(未验证)

感谢您的链接 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(未验证)

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.