find命令是Linux系统管理员中最强大的工具之一。它根据用户给定的表达式在目录层次结构中搜索文件和目录,并且可以对每个匹配的文件执行用户指定的操作。

您可以使用find命令根据其权限,类型,日期,所有权,大小等搜索文件和目录。它也可以与其他工具(例如 grep sed )结合使用。

Linux find命令语法

find命令的一般语法如下:

find [options] [path...] [expression]
  • options属性控制符号链接,调试选项和优化方法的处理。
  • path...属性定义find将在其中搜索文件的一个或多个起始目录。
  • expression属性由选项,搜索模式和由运算符分隔的动作组成。

要在目录中搜索文件,调用find命令的用户需要对该目录具有读取权限。

让我们看一下以下示例:

find -L /var/www -name "*.js"
  • 选项-L(选项)告诉find命令跟随符号链接。
  • /var/www(路径…)指定要搜索的目录。
  • (表达式)-name "*.js告诉find搜索以.js结尾的文件(JavaScript文件)。

按名称查找文件

通过名称查找文件可能是find命令的最常见用法。要使用文件名查找文件,请在要搜索的文件名后加上-name选项。

例如,要在/home/myfreax目录中搜索名为document.pdf的文件,可以使用以下命令:

find /home/myfreax -type f -name document.pdf

要运行不区分大小写的搜索,请将-name选项更改为-iname

find /home/myfreax -type f -iname document.pdf

上面的命令将匹配“ Document.pdf”,“ DOCUMENT.pdf” .. etc.

按扩展名查找文件

按扩展名搜索文件与按名称搜索文件相同。例如,要在/var/log/nginx目录中查找所有以.log.gz结尾的文件,可以使用:

find /var/log/nginx -type f -name '*.log.gz'

值得一提的是,使用通配符时,必须加引号或用反斜杠\代替星号*符号,以免shell解释它。

要查找与正则表达式*.log.gz不匹配的所有文件,可以使用-not选项。例如,要查找所有未以*.log.gz结尾的文件,您可以使用:

find /var/log/nginx -type f -not -name '*.log.gz'

按类型查找文件

有时您可能需要搜索特定的文件类型,例如普通文件,目录或符号链接。在Linux中,所有内容都是文件。

要根据文件的类型搜索文件,请使用-type选项和以下描述符之一来指定文件类型:

  • f:常规文件
  • d:目录
  • l符号链接
  • c:字符设备
  • b:块设备
  • p:命名管道(FIFO)
  • s:套接字

例如,要在当前工作目录中查找所有目录,可以使用:

find . -type d

常见示例是使用 chmod 命令将网站文件权限递归更改为644,目录权限更改为755

find /var/www/my_website -type d -exec chmod 0755 {} \;
find /var/www/my_website -type f -exec chmod 0644 {} \;

按大小查找文件

要根据文件大小查找文件,请传递-size参数以及大小标准。您可以使用以下后缀指定文件大小:

  • b:512字节块(默认)
  • c:字节
  • w:两字节字
  • k:千字节
  • ​​ M:兆字节
  • G:千兆字节

以下命令将在/tmp目录中找到所有1024个字节的文件:

find /tmp -type f -size 1024c

find命令还允许您搜索个大于或小于指定大小的文件。

在以下示例中,我们正在当前工作目录中搜索所有小于1MB的文件。注意大小值之前的减号-符号:

find . -type f -size -1M

如果要搜索大小大于1MB的文件,则需要使用加号+符号:

find . -type f -size +1M

您甚至可以搜索大小范围内的文件。以下命令将查找12MB之间的所有文件:

find . -type f -size +1M -size 21M

按修改日期查找文件

find命令还可以根据文件的最后修改,访问或更改时间来搜索文件。

与按大小搜索时相同,使用加号和减号表示“大于”或“小于”。

假设几天前,您修改了一个鸽舍配置文件,但您忘记了其中一个。您可以轻松过滤/etc/dovecot/conf.d目录下以.conf结尾并且在最近五天内已被修改的所有文件:

find /etc/dovecot/conf.d -name "*.conf" -mtime 5

这是使用-daystart选项根据修改日期过滤文件的另一个示例。以下命令将列出/home目录中30或更多天前已修改的所有文件:

find /home -mtime +30 -daystart

按权限查找文件

-perm选项可让您根据文件权限搜索文件。

例如,要在/var/www/html目录中查找权限完全为775的所有文件,可以使用:

find /var/www/html -perm 644

您可以在数字模式前加上减号-或斜线/

如果将斜线/用作前缀,则至少一个类别(用户,组或其他类别)必须至少设置相应的位以使文件匹配。

考虑以下示例命令:

find . -perm /444

上面的命令将匹配所有为用户,组或其他用户设置了读取权限的文件。

如果将减号-用作前缀,则必须设置文件至少要匹配指定的位。以下命令将搜索对所有者和组具有读写权限并且可由其他用户读取的文件:

find . -perm -664

按所有者查找文件

要查找特定用户或组拥有的 个文件,请使用-user-group选项。

例如,要搜索用户myfreax拥有的所有文件和目录,应运行:

find / -user myfreax

这是一个真实的例子。假设您要查找用户www-data拥有的所有文件,并将匹配文件的所有权从www-data更改为nginx

find / -user www-data -type f  -exec chown nginx {} \;

查找和删除文件

要删除所有匹配的文件,请将-delete选项附加到匹配表达式的末尾。

仅在确信结果与要删除的文件匹配时,请确保仅使用此选项。使用-delete选项之前,最好先打印匹配的文件。

例如,要从/var/log/中删除所有以.temp结尾的文件,您可以使用:

find /var/log/ -name `*.temp` -delete

请谨慎使用-delete选项。 find命令行被评估为表达式,如果您首先添加-delete选项,该命令将删除您指定的起点以下的所有内容。

关于目录,find只能删除与 rmdir 相同的空目录。

结论

我们向您展示了如何在各种选项和条件下使用find命令。

本文应该使您对如何在Linux系统上定位文件有基本的了解。您也可以访问 find手册页,并阅读find命令的所有其他强大功能。

如有任何疑问或评论,请在下面发表评论。

如果你喜欢我们的内容可以选择在下方二维码中捐赠我们,或者点击广告予以支持,感谢你的支持