The find
命令是 Linux 系统管理员工具库中最强大的工具之一。它根据用户给定的表达式在目录层次结构中搜索文件和目录,并可以对每个匹配的文件执行用户指定的操作。
您可以使用find
命令根据文件和目录的权限、类型、日期、所有权、大小等搜索文件和目录。它还可以与其他工具结合使用,例如grep
or sed
.
find
命令语法#
的一般语法为find
命令如下:
find [options] [path...] [expression]
- The
options
属性控制符号链接的处理、调试选项和优化方法。
- The
path...
属性定义 find 将搜索文件的起始目录或目录。
- The
expression
属性由由运算符分隔的选项、搜索模式和操作组成。
要搜索目录中的文件,用户调用find
命令需要对该目录具有读取权限。
让我们看一下下面的例子:
find -L /var/www -name "*.js"
- 选项
-L
(选项)告诉find
命令来跟踪符号链接。
- The
/var/www
(path...) 指定要搜索的目录。
- 表达方式)
-name "*.js
tells find
搜索以以下结尾的文件.js
(JavaScript 文件)。
按名称查找文件#
按名称查找文件可能是最常见的用途find
命令。要按文件名查找文件,请使用-name
选项后跟您要搜索的文件的名称。
例如,要搜索名为的文件document.pdf
in the /home/linuxize
目录,您将使用以下命令:
find /home/linuxize -type f -name document.pdf
要运行不区分大小写的搜索,请更改-name
选项与-iname
:
find /home/linuxize -type f -iname document.pdf
上面的命令将匹配“Document.pdf”、“DOCUMENT.pdf”等。
按扩展名查找文件#
按扩展名搜索文件与按名称搜索文件相同。例如,要查找以以下结尾的所有文件.log.gz
在 - 的里面/var/log/nginx
目录,您可以输入:
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
常见的示例是递归地将网站文件权限更改为644
和目录权限755
使用chmod命令:
find /var/www/my_website -type d -exec chmod 0755 {} \;
find /var/www/my_website -type f -exec chmod 0644 {} \;
按大小查找文件#
要根据文件大小查找文件,请传递-size
参数以及尺寸标准。您可以使用以下后缀来指定文件大小:
-
b
:512 字节块(默认)
-
c
: bytes
-
w
: 两字节字
-
k
:千字节
-
M
:兆字节
-
G
:千兆字节
以下命令将精确查找所有文件1024
内的字节数/tmp
目录:
find /tmp -type f -size 1024c
The find
命令还允许您搜索更大的文件或小于指定尺寸。
在下面的示例中,我们搜索所有小于1MB
在当前工作目录内。注意减号-
尺寸值之前的符号:
find . -type f -size -1M
如果要搜索大小大于的文件1MB
,那么你需要使用加号+
symbol:
find . -type f -size +1M
您甚至可以搜索某个大小范围内的文件。以下命令将查找之间的所有文件1
and 2MB
:
find . -type f -size +1M -size 21M
按修改日期查找文件#
The find
命令还可以根据文件的上次修改、访问或更改时间来搜索文件。
与按大小搜索时相同,使用加号和减号表示“大于”或“小于”。
假设几天前,您修改了一个 dovecot 配置文件,但您忘记了是哪一个。您可以轻松过滤该目录下的所有文件/etc/dovecot/conf.d
以结尾的目录.conf
并在最近五天内进行了修改:
find /etc/dovecot/conf.d -name "*.conf" -mtime 5
这是根据修改日期过滤文件的另一个示例,使用-daystart
选项。下面的命令将列出目录中的所有文件/home
修改过的目录30
或多天前:
find /home -mtime +30 -daystart
按权限查找文件#
The -perm
选项允许您根据文件权限搜索文件。
例如,要查找具有完全权限的所有文件775
在 - 的里面/var/www/html
目录,您将使用:
find /var/www/html -perm 644
您可以在数字模式前加上减号-
或斜线/
.
当斜线/
用作前缀,则至少一个类别(用户、组或其他)必须至少设置相应的位才能使文件匹配。
考虑以下示例命令:
find . -perm /444
上述命令将匹配为用户、组或其他人设置读取权限的所有文件。
如果减去-
用作前缀,那么为了使文件匹配,至少必须设置指定的位。以下命令将搜索所有者和组具有读写权限且其他用户可读的文件:
find . -perm -664
按所有者查找文件#
查找文件owned由特定用户或组使用-user
and -group
选项。
例如,搜索用户拥有的所有文件和目录linuxize
,你会运行:
find / -user linuxize
这是一个现实世界的例子。假设您想查找用户拥有的所有文件www-data
并更改匹配文件的所有权www-data
to nginx
:
find / -user www-data -type f -exec chown nginx {} \;
查找并删除文件#
要删除所有匹配的文件,请附加-delete
选项到匹配表达式的末尾。
确保仅当您确信结果与要删除的文件匹配时才使用此选项。在使用之前打印匹配的文件总是一个好主意-delete
option.
例如,删除所有以.temp
来自/var/log/
,你会使用:
find /var/log/ -name `*.temp` -delete
Use the -delete
选择时要极其谨慎。这find
命令被评估为表达式,如果您添加-delete
首先选择选项,该命令将删除您指定的起点以下的所有内容。
当谈到目录时,find
只能删除空目录,与rmdir
.
结论#
我们已经向您展示了如何使用find
具有各种选项和标准的命令。
本文应该让您对如何在 Linux 系统上查找文件有一个基本的了解。您还可以访问查找手册页并阅读有关所有其他强大选项的信息find
命令。
如果您有任何疑问或意见,请在下面留言。