在Linux中find命令用法和示例

时间:2020-03-21 11:43:34  来源:igfitidea点击:

在任何操作系统中,搜索文件都是非常正常且必不可少的任务。
刚接触Linux的人发现这项任务很困难,只是因为他们不知道命令行的强度。

大多数Linux发行版都预装有“find”命令工具来搜索文件。
find命令的问题在于,它接受许多命令行选项和参数,这使得几乎不可能一次记住它们。

用户期望从任何文件搜索工具获得的最重要的一点是,他应该立即记住搜索结果,并且在记住搜索选项时开销最少。
find命令的新用户发现它很烦人,因为在不带参数的情况下搜索时,它会在屏幕上转储很多输出。

让我们看看当我们在Linux机器上键入命令find时会发生什么。

[root@localhost ~]# find
.
./.bash_profile
./.tcshrc
./.gconf
./.gconf/apps
./.gconf/apps/gnome-session
./.gconf/apps/gnome-session/%gconf.xml
./.gconf/apps/gnome-session/options
./.gconf/apps/gnome-session/options/%gconf.xml
./.gconf/apps/%gconf.xml
./.bash_logout
./.gconfd
./.gconfd/saved_state
./install.log
./.bash_history
./.cshrc
./.bashrc
./install.log.syslog

我们可以从上面的输出中看到,find命令只给了我运行命令的当前目录的完整目录路径列表。

通过使用find命令在位置中按文件名搜索文件。

[root@localhost ~]# find /var/-name mail
/var/spool/mail
/var/log/mail
/var/mail

第一个参数(/var)是find命令将其中搜索的路径。

第二个参数-name用于指定将用于搜索文件名的字符串。

第三个参数“ mail”是find命令将在/var目录中以文件名查找的“字符串”

使用find命令在整个计算机中搜索文件

因此,如果要在整个计算机中搜索相同的字符串,则需要使用“ /”作为第二个参数来搜索整个文件系统。

[root@localhost ~]# find/-name mail
/usr/share/emacs/21.4/lisp/mail
/var/spool/mail
/var/log/mail
/var/mail
/etc/mail
/bin/mail

这里要注意的一个重要事实是,如果上述命令是由普通用户运行的,则我们会看到很多权限被拒绝的消息,因为普通用户对整个系统没有权限。

使用find命令搜索多个位置

如果要在Linux中使用find命令搜索多个位置,则只需在命令行中依次指定一个位置即可,只需执行以下操作即可。

[root@localhost ~]# find /var//usr/-name mail
/var/spool/mail
/var/log/mail
/var/mail
/usr/share/emacs/21.4/lisp/mail
[root@localhost ~]#

在find命令搜索时忽略大写字母和小写字母

我们也可以在搜索中忽略大小写,方法是使用“ iname”参数而不是使用find命令命名。

[root@localhost ~]# find /var//usr/-iname mail
/var/spool/mail
/var/log/mail
/var/mail
/usr/share/emacs/21.4/lisp/mail
/usr/bin/Mail

使用find命令查找带有开始和结束字符的文件

可以使用find命令来搜索带有开始和结束字符的文件,如下所示。

[root@localhost ~]# find /var/-iname a*og
/var/log/anaconda.log
/var/log/audit/audit.log
/var/log/anaconda.syslog

我已将起始字符定为“ a”,并将结束字符定为“ og”

使用“find”命令仅搜索目录

如果要使用find命令仅搜索某个位置中的目录,则可以如下所示进行操作。

[root@localhost log]# find /var/log/-type d -name mail
/var/log/mail

使用find命令搜索用户拥有的文件

可以通过使用linux中的find命令来查找特定用户拥有的文件,如下所示。

[root@localhost ~]# find /var/-user john
/var/spool/mail/john

上面的命令在/var目录中搜索用户john拥有的文件。
我们还可以通过仅用/替换/var来搜索整个系统中john拥有的文件。

查找修改超过X天的文件

要在系统中查找经过修改超过指定天数的文件,则可以使用以下命令进行操作。

[root@localhost ~]# find /var/lib/-type f -mtime +30
/var/lib/hsqldb/sqltool.rc
/var/lib/hsqldb/webserver.properties
/var/lib/hsqldb/server.properties
/var/lib/hsqldb/lib/functions
/var/lib/xkb/README.compiled
/var/lib/sepolgen/perm_map

上面显示的示例将在/var/lib目录中为我们提供文件,这些文件已在30多天前进行了修改。

使用find命令查找在X天之内修改的文件

我们也可以使用linux中的find命令,执行与上述命令相反的操作,例如修改少于30天的文件。

[root@localhost ~]# find /var/lib/-type f -mtime -30
/var/lib/setroubleshoot/audit_listener_database.xml
/var/lib/setroubleshoot/email_alert_recipients
/var/lib/dhclient/dhclient-eth0.leases
/var/lib/logrotate.status
/var/lib/alternatives/jaxp_parser_impl
/var/lib/alternatives/etags

主要区别在于我们将选项传递给-mtime参数的方式。
在mtime中使用“-”选项可以在30天内修改文件,在-mtime中使用“ +”选项可以在30天内修改文件。

我们可能已经看到,我们使用-type选项使用find命令search来指定文件和目录。
我们可以使用find命令的-type选项进行一些更精确的搜索,因为它还支持以下文件类型。

s套接字文件
l链接文件(符号)
ccharecter文件
b块文件
p管道文件

使用find命令根据权限搜索文件

现在让搜索文件基于其许可。
让我们搜索系统上权限为666的所有文件(这将是一个很长的列表。
.i在此示例中将不显示整个输出)

[root@myvm1 ~]# find /var/-perm 666
/var/run/sdp
/var/run/acpid.socket
/var/spool/postfix/private/rewrite
/var/spool/postfix/private/bounce
/var/spool/postfix/private/cyrus

你们中的大多数人可能都知道以下事实:在某些命令上设置了SUID,SGID位,以便在拥有者许可的情况下,普通用户可以运行它。
现在让我们看看如何使用find命令在系统上搜索所有具有SUID位的文件。

[root@myvm1 ~]# find/-perm /u=s
/usr/sbin/ccreds_validate
/usr/sbin/suexec
/usr/sbin/userhelper
/usr/sbin/usernetctl
/usr/bin/newgrp
/usr/bin/chsh
/usr/bin/rcp
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/sudo
/usr/bin/at
/usr/bin/Xorg
/usr/bin/chage

在上面的命令中,我使用“ /”作为参数在整个文件系统中进行搜索。

通过使用以下方法,可以对SGID执行相同的操作。

[root@myvm1 ~]# find/-perm /g=s
/usr/sbin/postqueue
/usr/sbin/sendmail.sendmail
/usr/sbin/postdrop
/usr/sbin/lockdev

前面我们看到了使用find命令在指定天数内或者超过指定天数修改查找文件的示例。
现在,让我们查看使用find命令在指定天数之内或者之前访问的文件。

[root@myvm1 ~]# find /var/log/-type f -atime -10
/var/log/wtmp
/var/log/boot.log.1
/var/log/rpmpkgs
/var/log/xferlog.1
/var/log/messages.2

上面的命令将为我们提供在10天内可以访问的文件。
我们也可以通过将上述命令中的“ -10”更改为“ +10”来搜索10天之前访问的文件。

查找几分钟前修改过的文件

到现在为止,我们只看到了在一天中搜索具有指定属性的文件的方法。
现在让我们看看如何使用find命令在指定的分钟内搜索被修改,访问的文件。

例如,让我们查找系统中所有在10分钟内被修改的文件。

[root@myvm1 ~]# find /var/log/-mmin -10
/var/log/sa/sa27
/var/log/messages
/var/log/cron

现在,让我们查找在20分钟之前访问过的文件。

[root@myvm1 ~]# find /var/log/-amin +20
/var/log/anaconda.xlog
/var/log/wtmp

现在,如果我们要查找在30分钟之前被修改过的文件,则可以通过不给-mmin参数任何符号(既不也不+)来实现。

查找具有指定大小的文件

现在,借助find命令开始搜索具有指定大小的文件。
我们将在find命令中使用-size选项来实现此目的。

[root@myvm1 ~]# find /var/log/-type f -size +10M
/var/log/file1

上面显示的示例命令将在/var/log目录中搜索大小超过10MB的文件。

C用于指定文件大小以字节为单位
k千字节
MMB字节
GGB字节

我们可以使用上面显示的选项来查找大于或者小于或者完全相同大小的文件

现在,让文件位于指定位置,其大小恰好与我们提到的文件大小相同。

[root@myvm1 ~]# find /var/log/-type f -size 1000M
/var/log/file1

上面显示的命令将找到大小恰好为1000M的文件。

查找指定大小的文件并将其删除

现在让我们看看如何在/var/log /位置找到所有大于100M的文件,并一次性删除它们。

[root@myvm1 ~]# find /var/log/-type f -size 1000M -exec rm {} \;
[root@myvm1 ~]#

使用inode搜索文件

如果我们知道使用Linux中的find命令的索引节点号,也可以搜索具有特定索引节点的文件。

[root@myvm1 ~]# find/-inum 511571
/root/test

在目录中搜索文件而不搜索其子目录

以下命令将在/var/log /中搜索名称“ mail”,但不会在/var/log中搜索目录

[root@myvm1 ~]# find /var/log/-maxdepth 1 -name mail
/var/log/mail

上例中显示的maxdepth选项可用于指定搜索位置的深度,例如maxdepth为2将搜索子目录,但不搜索subdirectoreis内的子目录。

查找5天之前修改过的文件,并且文件大小已指定

以下命令将搜索/var/log中的文件,这些文件在10天之前已被修改并且大小小于1M。

[root@myvm1 ~]# find /var/log/-mtime +10 -size -1M
/var/log/pm/suspend.log
/var/log/tallylog
/var/log/nginx_access_log
/var/log/puppet/masterhttp.log
/var/log/xferlog.3

查找零字节的文件

要查找空或者零字节的文件,可以使用以下命令。

[root@myvm1 ~]# find /var/log/-empty
/var/log/pm/suspend.log
/var/log/tallylog
/var/log/nginx_access_log
/var/log/puppet/masterhttp.log
/var/log/ppp
/var/log/xferlog.3

-empty参数用于搜索零字节的空文件。

查找所有带有链接的文件

我们可以将-l选项与前面提到的type参数一起使用,以查找具有软链接的文件。

[root@myvm1 ~]# find/-type l | head -10
/usr/sbin/system-config-network-cmd
/usr/sbin/authconfig-tui
/usr/sbin/adsl-setup
/usr/sbin/vgrename
/usr/sbin/pvck
/usr/sbin/vidmode

我已经列出了要求上面的命令仅列出它找到的前10个文件,因为输出太长了,因为系统包含许多链接文件。

查找所有权限不是755的文件

要查找系统中权限不是755的所有文件,我们可以使用以前使用的相同权限选项,但使用不同的方式。

[root@myvm1 ~]# find/-type f ! -perm 0755 | head -10
/usr/sbin/ypserv_test
/usr/sbin/postqueue
/usr/sbin/lvm
/usr/sbin/pppoe-discovery
/usr/sbin/makemap
/usr/sbin/groupdel
/usr/sbin/callback
/usr/sbin/makewhatis
/usr/sbin/redhat_lsb_trigger.i386
/usr/sbin/tcpd

在上面的命令中,我们对“!”使用了否定。
用于查找没有权限755的文件。

查找系统中的所有可执行文件

我们可以使用以下find命令在系统中找到所有可执行文件。

[root@myvm1 ~]# find/-perm /a=x | head -10
/usr/sbin/ntp-keygen
/usr/sbin/vgrename
/usr/sbin/foomatic-fix-xml
/usr/sbin/pvck
/usr/sbin/nscd
/usr/sbin/vidmode
/usr/sbin/postkick
/usr/sbin/tunelp
/usr/sbin/reject
/usr/sbin/pm-suspend

上面的命令将为我们提供所有文件的列表,并对所有文件具有执行权限。
我使用head选项,因为输出太大。

使用find命令搜索所有空目录

我们可以在linux中找到所有空目录,与我们搜索空文件的方式完全相同。

[root@myvm1 ~]# find /var/log/-type d -empty
/var/log/ppp
/var/log/conman
/var/log/conman.old
/var/log/samba

请注意,我们已经在带有-type参数的目录中使用了“ d”选项来搜索目录。
如果要搜索整个系统,请将/var/log /替换为“ /”。

查找5Mb和10M之间的文件

现在要查找所有大小在5MB到10Mb(大于5M小于10M)之间的文件,我们可以使用以下命令。

[root@myvm1 conman]# find/-type f -size +5M -size -10M
/usr/libexec/gcc/i386-redhat-linux/4.1.1/f951
/usr/libexec/gcc/i386-redhat-linux/4.1.1/cc1
/usr/libexec/gcc/i386-redhat-linux/4.1.1/cc1plus
/usr/libexec/mysqld
/usr/lib/vmware-tools/lib64/libgtkmm-2.4.so.1/libgtkmm-2.4.so.1
/usr/lib/mysql/plugin/ha_innodb_plugin.so.0.0.0

带-size参数的“ +”选项始终用于指定大于...的文件,带-size参数的“-”选项始终用于指定小于...的文件