linux基础知识-16
Tofloor
poster avatar
老陌
deepin
2018-07-19 00:38
Author
参见老陌博客:https://www.cnblogs.com/myccloves/p/9328537.html


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

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

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

deepin:
  1. sudo apt install locate
Copy the Code
centos:
  1. yum install mlocate
Copy the Code

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

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

  1. [linux@ccloves exercises]$ locate smb.conf
  2. /etc/samba/smb.conf
  3. /usr/share/doc/samba-common/examples/smb.conf.default.gz
  4. /usr/share/man/man5/smb.conf.5.gz
  5. /usr/share/samba/smb.conf
  6. /var/lib/ucf/cache/:etc:samba:smb.conf
Copy the Code

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

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

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

  1. find  <起始目录>  <搜索条件>  <动作>
Copy the Code

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

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

  1. [root[url=home.php?mod=space&uid=72751]@localhost[/url] ~]# find /etc
  2. /etc
  3. /etc/fstab
  4. /etc/crypttab
  5. /etc/mtab
  6. /etc/resolv.conf
  7. /etc/grub.d
  8. /etc/grub.d/00_header
  9. ......
Copy the Code

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

  1. [root@localhost ~]# find /etc -name *.conf
  2. /etc/resolv.conf
  3. /etc/depmod.d/dist.conf
  4. /etc/dracut.conf
  5. /etc/prelink.conf.d/nss-softokn-prelink.conf
  6. /etc/prelink.conf.d/fipscheck.conf
Copy the Code

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

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

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

-size 后面跟上文件的大小,比如:
  1. find . -size +10M
Copy the Code

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

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

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


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

查找用户linux中所有的jpg图片
  1. find /home/linux  -name *.jpg
Copy the Code

查找用户linux中所有的jpg图片,并复制到/tmp/images目录中
  1. mkdir /tmp/images
  2. find /home/linux  -name *.jpg -exec cp {} /tmp/images \;
Copy the Code

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

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

老陌对管理员这样的行为感到羞耻,能不能做的更绝一些,下载的png也拿过来。这就是说,如果文件是jpg格式,或者文件是png格式都要复制过来。这样就出现了一种“或”的表达式方式,在find命令中用 -or表示或。
  1. find /home/linux  -name *.jpg -or -name *.png -exec cp {} /tmp/images \;
Copy the Code

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

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

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


测试一下:

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

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


Reply Favorite View the author
All Replies

No replies yet