linux基础知识-16

一、查找文件

在linux中查找文件可以用locate 和find命令。

locate在数据库中查找,非常快,但数据库不是实时更新的,有可能找不到。 而find根据文件名来查找,也可以根据所有者,属组,权限,最后修改日期等其它条件来查找。 因为find是实时搜索,所以比较慢。

二、locate命令

老陌在测试中发现没有这个命令,所以需要先安装一下, 由于需要在本机和虚拟机中测试,所以两者都需要安装:

deepin:

sudo apt install locate

centos:

yum install mlocate

centos中老陌直接安装发现没有这个软件包,后来搜索一下: yum list | grep locate 发现在mlocate这个软件包中了。

老陌要找一下smb.conf文件:

[linux@ccloves exercises]$ locate smb.conf
/etc/samba/smb.conf
/usr/share/doc/samba-common/examples/smb.conf.default.gz
/usr/share/man/man5/smb.conf.5.gz
/usr/share/samba/smb.conf
/var/lib/ucf/cache/:etc:samba:smb.conf

发现带有smb.conf字样的全都找到了。 不过第一次测试的时候啥也没有,因为刚安装完,这些文件信息还没有更新到数据库中,所以手动更新一下:

sudo updatedb

locate命令支持元字符,和bash用法相同,比如:*, ?, []等。 比如搜索:mp4文件

locate *.mp4

三、find命令

与locate不同,find命令在文件系统中查找。 几乎所有的文件属性都可以做为查找的条件,比如:按文件名查找,按大小查找等。

find  <起始目录>  <搜索条件>  <动作> 

(一)起始目录

起始目录默认就是当前目录,表示在哪儿开始搜索。默认的搜索条件是所有文件,默认的动作是打印搜索到的文件名。

比如:查找/etc下所有的文件

[root@localhost ~]# find /etc
/etc
/etc/fstab
/etc/crypttab
/etc/mtab
/etc/resolv.conf
/etc/grub.d
/etc/grub.d/00_header
......

(二) 搜索条件

通常我们用文件名作为搜索条件,比如搜索/etc下所有的conf文件

[root@localhost ~]# find /etc -name *.conf
/etc/resolv.conf
/etc/depmod.d/dist.conf
/etc/dracut.conf
/etc/prelink.conf.d/nss-softokn-prelink.conf
/etc/prelink.conf.d/fipscheck.conf

这里-name用于限定按文件名搜索,可以用元字符进行匹配搜索.

搜索条件还有很多,比如:-emtpy 搜索空文件,-group gname 按属组进行搜索, -size 按大小进行搜索,还有按时间,按类型等,这里不一一列举。虽然功能多多,但我们用的时候基本就是-name。

老陌经常用的就是-name, -size,其它的都没有用过。

-size 后面跟上文件的大小,比如:

find . -size +10M

这表示搜索大于10M的文件,如果是-10M表示搜索小于10M的文件,如果没有+,-号则表示搜索等于10M的文件。

(三) 动作

动作是指对探索到的文件做什么,默认是打印文件名。

选项 说明
-exec command 对匹配的文件执行commmand,用{}表示匹配的文件
-ok command 与-exec的作用相同,但每个文件操作的动作都需要确认
-ls 以 ls -dlis的格式输出

下面老陌以实例说明一下find的用法

查找用户linux中所有的jpg图片

find /home/linux  -name *.jpg

查找用户linux中所有的jpg图片,并复制到/tmp/images目录中

mkdir /tmp/images
find /home/linux  -name *.jpg -exec cp {} /tmp/images \;

查找的位置: /home/linux
查找的条件:-name *.jpg,
执行的动作:复制到/tmp/images中,-exec后面放上要执行的命令,这里用的是cp命令,{}表示查找到的文件, 动作要求以 “;” 结尾,但 “;” 在shell中用于分隔,所以必须用;进行转义。

好了,这样linux辛辛苦苦下载的图片,被管理员一条命令搬走了。

老陌对管理员这样的行为感到羞耻,能不能做的更绝一些,下载的png也拿过来。这就是说,如果文件是jpg格式,或者文件是png格式都要复制过来。这样就出现了一种“或”的表达式方式,在find命令中用 -or表示或。

find /home/linux  -name *.jpg -or -name *.png -exec cp {} /tmp/images \;

解释一下:find命令在/home/linux下查找,找到了jpg或者找到了png之后,去执行cp复制动作,cp把找到的内容复制到/tmp/images目录中。

上面的-or可以把多种搜索条件组合到一起,在find中还可以进行如下逻辑运算组合:

  • -or 或
  • -and 与
  • -not 非

测试一下:

找到/etc下所有不是以.conf结尾的文件。这里用-not进行非运算,也就是不是.conf结尾的文件就打印输出。

find /etc -not -name *.conf

找到大于2M并且小于5M的文件。这里用-and对两个条件进行组合,表达了大于2M并且小于5M的意思。

find . -size +2M -and -size -5M
posted @ 2018-07-18 12:45  老陌  阅读(255)  评论(0编辑  收藏  举报