Linux中的 find 命令(查找文件和目录)

评论 0 浏览 0 2018-06-14

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

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

find 命令的句法

find命令的一般语法如下:。

find [options] [path...] [expression] 
  • options属性控制了对符号链接、调试选项和优化方法的处理。
  • path...属性定义了find将搜索文件的起始目录或目录。
  • expression属性是由选项、搜索模式和由运算符隔开的动作组成的。

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

让我们看一下下面的例子。

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

按名称查找文件

按名称查找文件可能是find命令最常见的用途。要根据文件名查找文件,使用-name选项,后面跟上你要搜索的文件名。

例如,要在/home/linuxize目录下搜索一个名为document.pdf的文件,你可以使用下面的命令。

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

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

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

上面的命令将匹配 "Document.pdf"、"DOCUMENT.pdf"......等。

按扩展名查找文件

按扩展名搜索文件与按名称搜索文件是一样的。例如,要在/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: 命名的管道(先进先出)。
  • s: socket

例如,要找到当前工作目录中的所有目录,你可以使用。

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命令还可以根据文件的最后修改、访问或更改时间来搜索文件。

与按尺寸搜索时一样,使用加号和减号来表示 "大于 "或 "小于"。

比方说,几天前,你修改了dovecot的一个配置文件,但你忘记了是哪一个。你可以很容易地过滤/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 775

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

当斜线/被用作前缀时,那么至少有一个类别(用户、组或其他)必须至少有相应的位被设置,以使文件匹配。

考虑一下下面的命令示例。

find . -perm /444

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

如果用减去-作为前缀,那么为了匹配文件,至少必须设置指定的位。下面的命令将搜索对所有者和组有读和写权限的文件,并且其他用户可以阅读。

find . -perm -664

按所有者查找文件

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

例如,要搜索用户linuxize所拥有的所有文件和目录,你需要运行。

find / -user linuxize

下面是一个现实世界的例子。假设你想找到由用户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系统中定位文件有一个基本的了解。你也可以访问findman page,阅读关于find命令的所有其他强大选项。

如果你有任何问题或意见,请在下面留言。

最后更新2023-10-04
0 个评论
标签