如何在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输出 |
显示匹配文件的完整路径名。如果没有指定其他操作,则为默认操作 | |
-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
命令,它将对您的任务有很大帮助,并能简化操作。掌握它的关键是练习和使用它!