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

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

find命令的一般语法形式是find [options] [path...] [expression]options选项属性控制符号链接,调试选项和优化的处理。

path...路径属性定义find搜索文件的起始目录,你为find指定一个或多个起始目录。expression表达式属性由选项,搜索模式和由运算符分隔的动作组成。

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

让我们看一下示例find -L /var/www -name "*.js"。选项-L告诉find命令跟随符号链接。

/var/www是find命令搜索的开始目录。表达式-name "*.js告诉find搜索以.js结尾的文件JavaScript文件。

按名称查找/搜索文件

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

例如,要在/home/myfreax目录中搜索名为document.pdf的文件,可以使用命令find /home/myfreax -type f -name document.pdf

find的-name选项是区分大小写的,如果你需要运行不区分大小写的搜索,请将-name选项更改为-iname。find命令将匹配Document.pdfDOCUMENT.pdf等。

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

按文件扩展名查找文件

根据扩展名搜索文件与按名称搜索文件相同。例如,要在/var/log/nginx目录中查找所有以.log.gz结尾的文件,可以使用命令find /var/log/nginx -type f -name '*.log.gz'

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

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

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

按类型查找文件

有时您可能需要搜索指定的文件类型,例如普通文件,目录或符号链接。在Linux中,一切都是文件,包括目录。

要根据文件的类型搜索文件,请使用find的-type选项指定文件类型。这里我们列出了Linux中所有文件的类型。

f是常规文件。d是目录。l符号链接c是字符设备。b是块设备。p是命名管道FIFO。s是socket套接字。

例如,要在当前工作目录中查找所有目录,可以使用命令find . -type d,这里. 表是当前目录,-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 {} \;

按大小查找文件

要根据文件大小查找文件,请使用find命令的-size选项,之后指定文件的大小。您可以使用以下后缀指定文件大小。

如果你使用-size选项,但为指定文件的大小,find将会使用512字节作为大小进行文件的搜索。

b是512字节。c是字节。w是两字节。k千字节即kb,​​ M是兆字节,即MB,G是千兆字节即是GB。

例如命令find /tmp -type f -size 1024c将在/tmp目录中找到所有1024字节的文件。

find命令还允许您搜索大于或小于指定大小的文件。你可以使用加减符号和文件的大小表示大于或者小于,+符号表示大于,-减符号表示小于。

例如命令find . -type f -size -1M,将在当前工作目录中搜索所有小于1MB的文件。注意大小值之前的是减号符号-

命令find . -type f -size +1M将搜索大小大于1MB的文件,注意大小值之前的是加号符号+

您甚至可以搜索大小范围内的文件。以下find命令将在当前目录下搜索/查找1MB到和2MB之间的所有文件。

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

按日期查找文件

find命令还可以根据文件的最后修改,访问或更改时间来搜索文件。与按大小搜索时相同,使用加号和减号表示大于或小于。

例如命令find /etc/dovecot/conf.d -name "*.conf" -mtime 5。将搜索/etc/dovecot/conf.d目录下以.conf结尾并且在最近五天内已被修改的所有文件。

除了使用24小时作为单位之外,你还可以使用分钟,小时,秒等单位作为搜索的条件。我们将在这里列出这些选项。

-amin表示文件最后的访问时间,以分钟作为单位。-atime表示最后的访问时间,以24小时作为单位,即一天。这两个选项都表示在指定访问时间之内。

-cmin表示文件在最后更改时间,以分钟作为单位。-ctime表示文件在最后更改时间,但以24小时作为单位,即一天。这两个选项都表示在指定最后更改时间之内。

-mmin表示文件的最后修改时间,以分钟作为单位。-mtime表示文件的最后修改时间,但以24小时作为单位,即一天。这两个选项都表示在指定修改时间之内。

如果你需要指定修改,访问或更改时间之外作为搜索条件。你可以使用find的-daystart选项。它将会修改以上选项为时间之外。

这是根据修改日期过滤文件的另一个示例。以下命令将列出/home目录中30多天之后修改的所有文件,包括30天的。

find /home -mtime +30 -daystart

按权限查找文件

find的-perm选项可让您根据文件权限搜索文件。你可以使用文件权限的符号模式,或者数字模式进行搜索。

我们建议你使用数字模式,因为符号模式会显得更复杂,这不易于阅读。您可以在数字模式前加上减号-或斜线/

如果将斜线/用作前缀,则至少是用户,组或其他人的其中一个权限位与文件匹配。如果将减号-用作前缀,则文件的权限位必须全匹配。

find . -perm /444
find . -perm -664

按所有者查找文件

find的-user-group选项允许你要查找指定用户或组拥有的文件。例如命令find / -user myfreax,将会搜索用户myfreax拥有的所有文件和目录。

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

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

查找并删除文件

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

建议仅在确定结果与要删除的文件匹配时,使用-delete选项。你可以先打印匹配的文件,然后再加-delete选项。请谨慎使用-delete选项。

对于目录的删除,find的--delete选项只能删除与rmdir相同的空目录。例如,要从/var/log/中删除所有以.temp结尾的文件,您可以运行以下find命令。

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

结论

我们向您展示了如何在各种选项和条件下使用find命令。本文应该使您对如何在Linux系统上搜索文件有基本的了解。

您也可以访问find手册页,并阅读find命令的所有其他强大功能。如有任何疑问或评论,请在下面发表评论。