Linux中的 find 命令(查找文件和目录)
find
命令是Linux系统管理员武库中最强大的工具之一。它根据用户给定的表达式在目录层次中搜索文件和目录,并可以对每个匹配的文件执行用户指定的操作。
你可以使用find
命令根据文件和目录的权限、类型、日期、所有权、大小等来搜索。它还可以与其他工具相结合,如grep
或sed
。
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
你甚至可以在一个大小范围内搜索文件。下面的命令将找到1
和2MB
之间的所有文件。
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系统中定位文件有一个基本的了解。你也可以访问find
man page,阅读关于find
命令的所有其他强大选项。
如果你有任何问题或意见,请在下面留言。