如何在Linux中使用find命令?[初学者指南]

在其基本形式中,查找很容易。同时,由于可用的选项、测试和操作数量,它也可能很复杂。

find命令是一种非常强大的工具,花费时间学习它将是有回报的。它将帮助你高效地执行各种系统管理任务,如磁盘空间管理、递归文件操作和备份。

Linux的find命令根据您定义的条件搜索文件和文件夹,并允许您对搜索结果执行操作。find的语法如下:

$ find 要搜索的目录 条件 动作

其中

  • 要搜索的目录是find开始查找文件的起始点。搜索包括该目录下的所有子目录。
  • 条件(测试)指定要搜索的文件
  • 动作指定对符合条件的每个找到的文件要执行的操作。

测试

按名称搜索

以下是一个简单的例子。以下命令在当前目录中搜索文件a.txt:

$ find . -name "a.txt"
./a.txt

其中

  • .表示当前目录
  • -name测试指定要匹配的条件

这个带有-name测试的搜索是区分大小写的,将忽略文件A.txt。为确保搜索不区分大小写,请使用-iname测试:

$ find . -iname "a.txt"
./a.txt
./A.txt

要搜索当前目录中所有的.jpg图像文件,使用通配符模式*.jpg

$ find . -name "*.jpg"
./genxfacebook2.jpg
./genxfacebook1.jpg
./Moodle2.jpg
./moodle.jpg
./moodle/moodle1.jpg
./genxfacebook.jpg

您可以使用要搜索的目录名。例如,要在/home目录中搜索所有的.jpg图像:

$ find /home -name "*.jpg"
find: `/home/ubuntu/.ssh': Permission denied
/home/vagrant/Moodle2.jpg
/home/vagrant/moodle.jpg
/home/me/hello.jpg
find: `/home/me/testfiles': Permission denied
find: `/home/me/data': Permission denied
/home/me/water.jpg
find: `/home/me/.cache': Permission denied

如果看到太多的权限被拒绝错误,您可以在命令的末尾添加2>/dev/null。这将将错误消息重定向到/dev/null设备,并给出更干净的输出:

find /home -name "*.jpg" 2>/dev/null
/home/vagrant/Moodle2.jpg
/home/vagrant/moodle.jpg
/home/me/hello.jpg
/home/me/water.jpg

按文件类型搜索

使用-type测试可以按类型搜索文件。文件类型可以是:

f 普通文件
d 目录
l 符号链接
b 块设备
c 字符设备
p 命名管道
s 套接字

例如,使用测试-type d只列出目录:

$ find . -type d
.
./.ssh
./.cache
./moodle

按文件大小搜索

您可能需要搜索大文件并删除它们。在以下示例中,测试-size后面跟着字符串+1G。这将搜索所有大于1GB的文件。

$ find . -size +1G 
./Microsoft_Office_16.29.19090802_Installer.pkg
./android-studio-ide-183.5692245-mac.dmg

+号表示搜索大于之后的数字的文件。减号(-)可以用来表示小于。不使用符号表示精确匹配大小。

数字后面跟着文件大小单位。单位可以是:

字符 大小单位
b 521字节块
c 字节
k 千字节
M 兆字节
G 吉字节

搜索空目录和文件

使用-empty测试来查找空目录和文件,如下所示:

$ find . -empty
./.cloud-locale-test.skip
./datafiles
./b.txt
...
./.cache/motd.legal-displayed

按文件修改时间搜索

您可以使用-cmin测试基于创建或修改时间来搜索所有文件和目录。要搜索在过去的60分钟内修改的所有文件(小于60),请使用-60,如下所示:

$ find . -cmin -60
.
./a.txt
./datafiles

对于在过去60分钟之前的任何时间修改的文件,请使用+60

按访问时间搜索

您可以使用-atime测试按最后访问时间搜索文件。例如,以下命令搜索在过去180天内未访问的文件:

$ find . -atime +180

如果磁盘空间不足,可以将这些文件移动到备份设备中。

按用户名搜索

使用-user 用户名测试,您可以搜索属于用户的所有文件和目录。例如,以下命令在/home目录中搜索属于用户ubuntu的所有文件和目录:

$ find /home -user ubuntu 2>/dev/null
/home/ubuntu
/home/ubuntu/.bash_logout
/home/ubuntu/.bashrc
/home/ubuntu/.ssh
/home/ubuntu/.profile

按模式搜索

希望搜索设置为特定模式(即具有特定权限集合)的文件?使用-perm测试。以下示例搜索权限设置为777的文件:

$ find /home -perm 777

操作符

您可以使用以下三个逻辑运算符来组合多个测试在一个find命令中:

  • -and
  • -or
  • -not

例如,以下命令搜索大于100MB并由用户me拥有的文件:

$ find /home  -user me  -and  -size +100M  2>/dev/null
/home/me/kali-linux-2020.3-installer-netinst-i386.iso

以下命令搜索大于100MB并由用户me或用户vagrant拥有的文件:

$ find /home ( -user vagrant -or -user me )  -and  -size +100M  2>/dev/null
/home/vagrant/LibreOffice_7.0.1_Linux_x86-64_deb.tar.gz
/home/me/kali-linux-2020.3-installer-netinst-i386.iso

您需要在括号前面加上反斜杠字符以防止shell尝试解释它们。

操作

find给您搜索结果,然后选择对它们执行操作。以下是一些预定义的操作:

操作 描述
-delete 删除与搜索条件匹配的文件
-ls 显示带有文件大小和inode计数的详细ls输出
-print 显示匹配文件的完整路径名。如果没有指定其他操作,则为默认操作
-exec 对搜索输出的每一行执行后面的命令

所以,如果你想搜索并删除所有空文件,可以这样做:

$ find . -empty -delete

注意:在使用删除操作之前,最好先使用-print操作运行一次命令,并确认结果。

-exec操作是特殊的。它允许您在搜索结果上执行自己选择的命令。就像这样:

-exec command {} ;

这里

  • command是您想要在搜索结果上执行的命令,比如rm、mv或cp。
  • {}代表搜索结果。
  • 命令以一个反斜杠转义的分号结尾。

所以,搜索并删除所有空文件的命令可以这样写:

$ find . -empty -exec rm {} ;

这里还有一个使用-exec操作的示例。以下命令将所有.png图像文件复制到备份/images目录:

$ find . -name "*.png" -exec cp {} /backups/images ;

结论

您可以使用find命令根据名称、最后访问日期、最后修改日期、用户(所有者)名称、组名称、大小、权限和其他各种条件搜索文件。通过这些搜索结果,您可以对它们执行删除、复制或移动到其他位置等操作。

一旦掌握了find命令,它将对您的任务有很大帮助,并能简化操作。掌握它的关键是练习和使用它!

类似文章