可以说,在 Linux 中,find 命令是后端开发人员必须掌握的操作之一,除非你在使用 Windows Server。
在技术面试中,它也是一个常见的话题。让我们看一个真实的问题:
如果在你的Linux服务器上有一个名为 logs 的目录,如何删除其中上次访问时间超过一年的日志文件?🤔
这种情况很常见,但令人惊讶的是,并不是每个开发人员都能在面试中清晰地写出这个命令。
答案:首先,我们需要使用 cd 命令进入相应的目录,然后,命令如下:
linuxmi@linuxmi:~/www.linuxmi.com$ find . -type f -atime +365 -exec rm -rf {} \;
如果你对上述命令还不完全理解,不用担心。本文将介绍 find 命令的 7 个实用用途,你最终会掌握它。如果你已经知道了,阅读本文将是一个很好的复习。
1、根据文件名或正则表达式查找文件
让我们从最简单的用法开始。要按特定名称搜索文件,命令如下:
linuxmi@linuxmi:~/www.linuxmi.com$ find . -name linuxmi.sh
上述代码中的.符号表示当前路径。如果我们想要搜索另一个路径下的文件,只需指定即可:
linuxmi@linuxmi:~/www.linuxmi.com$ find /home/linuxmi/linuxmi.com -name linuxmi.png
如何找到所有格式为 png 的图像?使用正则表达式:
find /home/linuxmi/linuxmi.com -name "*.png"
默认情况下,find 命令搜索常规文件,但最好指定类型以使一切更清晰:
find /home/linuxmi/linuxmi.com -type f -name "*.png"
2、查找不同类型的文件
除了搜索普通文件外,我们还可以通过指定-type选项来搜索其他类型的文件。
例如目录:
find . -type d -name "linuxmi*"
或者符号链接:
find . -type l -name "linuxmi*"
3、按特定的时间戳查找文件
要按特定的时间戳搜索文件,我们需要了解Linux系统中的3种不同时间戳:
访问时间戳(atime):文件上次被读取的时间。
修改时间戳(mtime):文件内容上次被修改的时间。
更改时间戳(ctime):文件的元数据,例如所有权、位置、文件类型和权限设置等上次更改的时间。
所以,就像开始时提到的面试问题一样,要搜索那些atime超过一年前的文件,我们可以编写以下命令:
linuxmi@linuxmi:~$ find . -type f -atime +365
如果我们需要找到 mtime 恰好是 5 天前的文件,请不要包含 + 号,因为它表示“大于”。
linuxmi@linuxmi:~$ find . -type f -mtime 5
显然,+号表示“大于”,-号表示“小于”。因此,我们可以搜索 ctime 在 5 到 10 天之间的文件:
linuxmi@linuxmi:~$ find . -type f -ctime +5 -ctime -10
4、按文件大小查找文件
-size选项使我们能够按特定大小查找文件。我们可以使用以下约定指定其计量单位:
- b:512字节块(默认)
- c:字节
- w:两字节单词
- k:千字节
- M:兆字节
- G:千兆字节
与按时间戳查找文件类似,+号表示“大于”,-号表示“小于”。例如,要查找大小在10兆字节和1千兆字节之间的文件:
find . -type f -size +10M -size -1G
5、按权限查找文件
适当控制文件的权限是Linux管理员的重要任务。find命令的-perm选项可以帮助我们按特定权限搜索文件:
find . -type f -perm 777
例如,上述命令将搜索所有具有777权限的文件,这意味着文件对其所有者、组和所有用户具有读、写和执行权限。
6、按文件所有者查找文件
这个任务很简单。我们只需要在-user选项中指定一个用户名。例如,以下命令将找到所有属于 linuxmi 的文件:
find -type f -user linuxmi
7、在查找文件后执行命令
在大多数情况下,我们希望在找到所需文件后执行一些后续操作,例如删除它们、检查它们的详细信息等等。-exec命令使所有这些操作变得更加简单。
现在,为了理解如何使用它,让我们回到之前提到的面试问题:
find . -type f -atime +365 -exec rm -rf {} ;
上述命令中-exec选项后面是rm -rf,用于删除文件。{}是找到的结果的占位符。
注意:占位符{}非常重要,特别是如果你想要删除文件。因为如果你不使用它,命令将对所有文件执行,而不仅仅是通过find命令找到的文件。
为了尝试一下,在终端上执行以下两个命令并检查它们的结果有什么不同:
一个使用了占位符:
find . -type f -atime +5 -exec ls {} ;
另一个没有使用:
find . -type f -atime +5 -exec ls ;
跟在-exec选项后面的命令必须以分号结束。正如我们所知,转义字符用于取消单个字符的特殊含义。在Linux中,反斜杠\被用作转义字符。因此,我们将其用于分号字符。
总结
阅读完find命令的7个用途后,之前提到的面试问题现在看起来非常简单了。现在你能直接写出答案并清楚地解释吗?
find . -type f -atime +365 -exec rm -rf {};
find . -type f -atime +365 -exec rm -rf {};