文件查找(find, locate)

文件查找(find, locate)

在Linux文件系统中快速、准确的搜索到自己想要的文件是运维人员的一项基本能力

在Linux系统中主要使用find和locate来查找文件,两者的区别如下

  • locate 基于数据库索引进行查找,查找文件速度快,是模糊查询,查找不够精确,同时数据库自动更新周期为每天一次,导致不能实时查找,可以通过手动更新数据库来达到实时查找,不过更新数据库将会搜索整个磁盘,耗费系统资源,当系统繁忙时是一件危险的操作。
  • find 命令选项特别多,可以根据各种条件精确查找文件,通过搜索磁盘进行查找,属于实时查找,由于搜索磁盘,速度比locate慢。

locate

locate [options] keyword
locate 查找包含关键词或正则表达式匹配的文件路径或文件名,然后输出文件的完整路径,所查找的文件需具有读、执行权限。

常用选项

-i | –ignore-cate #查找文件时忽略大小写
-r | –regexp REGEXP #使用基本正则表达式匹配文件路径
-n NUM #输出搜索到的前N个匹配的路径

实例

  1. 查找家目录下面包含.txt的文件
[centos7@root math]# locate ~/*.txt
/root/1.txt
/root/3.txt
/root/dest.txt
/root/destination.txt
/root/passwd.txt
/root/shadown.txt
/root/source.txt
  1. 查找/etc/目录下面结尾包含config,且路或文件名中包含数字的文件
locate -r "/etc/.*[[:digit:]]\+.*config$" <=使用正则表达式进行匹配
/etc/dconf/db/distro.d/10-authconfig
/etc/selinux/targeted/active/modules/100/authconfig
/etc/setuptool.d/98netconfig
/etc/setuptool.d/99authconfig
/etc/setuptool.d/99kbdconfig
/etc/setuptool.d/99mouseconfig
/etc/setuptool.d/99sndconfig
/etc/setuptool.d/99timeconfig
/etc/sysconfig/ip6tables-config
  1. 查找家目录下以m开头的文件,忽略大小写
[centos7@root math]# locate -i ~/m <= -i忽略大小写
/root/Music

find

find能够根据所给的条件精确查找文件,且可以对查找到的文件进行后续处理,所查找文件需有读、执行的权限

find [optins] [查找路径] [查找条件] [处理动作]

  • 查找路径: 指定具体查找文件的路径,默认为当前目录
  • 查找条件: 文件名,文件类型,属主属组、文件权限、文件大小,文件时间戳,路径层次,默认为所有文件
  • 处理动作: 对查找到的文件进行后续处理

查找条件

根据文件名和inode编号查找
有如下几种查找条件

-name PATTERN : 根据文件查找,可以使用通配符:*,?,[],[^]
-iname PATTERN : 根据文件名查找,忽略字母大小写
-inum N : 根据节点编号查找
-samefile FILE_NAME : 查找与指定文件相同inode编号的文件,即有硬链接关系的文件
-regex PATTERN : 用基本正则表达式匹配文件的整个路径,
-retextype type: 默认使用的正则表达式是emacs,可以指定为posix-awk, posix-basic, posix-egrep and posix-extended.
-links N : 查找inode编为N的文件

  1. 查找/boot目录下包含字符串grub的文件
  [centos6@root app]# find /boot -name "*grub*"
/boot/efi/EFI/redhat/grub.efi
/boot/grub
/boot/grub/grub.conf
  1. 在CentOS6系统上查找节点编号为2,但不包含/proc目录的文件
[centos6@root app]# find / -path "/proc" -prune -o -inum 2
/
/app
/proc
/boot
/sys/fs
/dev/pts/ptmx
  1. 在/etc 目录下查找以.config结尾,并且.config前面包含至少一个数字的文件
find /etc -regextype posix-egrep -regex ".*[[:digit:]]+\.config$" <=指定正则表达式类型为posix-egrep
/etc/pki/nss-legacy/nss-rhel6.config

指定搜索路径的层次

-maxdepth LEVEL #最大搜索路径深度,包括指定的搜索路径
-mindepth LEVEL #最小搜索路径深度,包括指定的搜索路径

  1. 查找/etc/sysconfig 目录下搜索层次为该目录下第二层,且文件名以ifcfg开头的文件
[centos6@root app]# find /etc/sysconfig -mindepth 2 -maxdepth 2 -name "ifcfg*"
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-eth0

根据属主属组查找

-user USER_NAME查找属主为USER_NAME的文件
-group GROUP_NAME 指定查找属组名为GROUP_NAME的文件
-uid UID #查找指定属主ID编号的文件
-gid #查找指定属组ID编号的文件
-nouser #查找没有属主的文件
-nogroup #查找没有属组的文件

  1. 查找当前目录下面用户名是zb20的所有文件
[centos7@root app]# find -user zb20 -ls
67228528 4 -rwxr-xr-x 1 zb20 root 272 Jul 31 20:44 ./scripts/test/1.sh
67228524 0 -rw-rw-r-- 1 zb20 zb20 0 Jul 31 20:51 ./scripts/test/f2
67228527 0 -rw-rw-r-- 1 zb20 zb20 0 Jul 31 20:51 ./scripts/test/f3
67228529 0 -rw-rw-r-- 1 zb20 zb20 0 Jul 31 20:51 ./scripts/test/10.txt
67228530 0 -rw-rw-r-- 1 zb20 zb20 0 Jul 31 20:51 ./scripts/test/11.txt
  1. 查找 / 目录下uid编号为48的文件
[centos6@root app]# find / -uid 48 -ls
787912 4 drwx------ 2 apache apache 4096 Mar 22 14:53 /var/lib/dav
787894 4 drwx------ 2 apache apache 4096 Mar 22 14:53 /var/cache/mod_proxy
  1. 查找整个系统中没有属主的文件
[centos6@root app]# find / -nouser -ls
262166 4 drwx------ 4 504 508 4096 Aug 1 00:42 /home/tom
262288 4 -rw-r--r-- 1 504 508 176 Mar 23 08:15 /home/tom/.bash_profile
262289 4 -rw-r--r-- 1 504 508 124 Mar 23 08:15 /home/tom/.bashrc
262290 4 drwxr-xr-x 4 504 508 4096 Jul 15 01:14 /home/tom/.mozilla
262291 4 drwxr-xr-x 2 504 508 4096 Aug 18 2010 /home/tom/.mozilla/plugins
262292 4 drwxr-xr-x 2 504 508 4096 Aug 18 2010 /home/tom/.mozilla/extensio

根据文件类型查找

-type TYPE #根据文件类型查找

文件类型有如下几种

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

  1. 查找 /run 目录下的套接字文件,管道文件,不包括子目录
 [centos7@root app]# find /run/ -maxdepth 1 \( -type p -o -type s \) -ls
17999 0 srwxr-xr-x 1 root root 0 Jul 31 07:20 /run/mcelog-client
16725 0 srw-rw-rw- 1 root root 0 Jul 31 07:20 /run/gssproxy.sock
15642 0 srw-rw-rw- 1 root root 0 Jul 31 07:20 /run/rpcbind.sock
10916 0 prw------- 1 root root 0 Jul 31 07:20 /run/dmeventd-client
10915 0 prw------- 1 root root 0 Jul 31 07:20 /run/dmeventd-server

组合条件

-a 与
-o 或
! | -not 非

根据文件大小查找

-size [+|-]#UNIT
UNIT: #单位有c(byte), k, M, G
-#UNIT: [0, #-1]UNIT 如-5k 表示[0, 4]k
#UNIT: (#-1, #]UNIT 如5k 表示(4, 5]k
+#UNIT: (#, +∞)UNIT 如+5k 表示(5, +∞)k

  1. 查找根下文件大于150M的文件
find / -path "/proc" -prune -o  -size +150M -exec ls -lh {} \;
-rw-r--r--. 1 root root 318M Dec 5 2016 /run/media/root/CentOS 7 x86_64/LiveOS/squashfs.img
-rw-r--r--. 1 root root 608M Jul 21 19:10 /var/cache/yum/x86_64/7/updates/gen/other_db.sqlite

根据时间戳查找

[time] [+|-]N
time 以天为单位-atime, -mtime, -ctime
time以分钟为单位 -amin, -mmin, -cmin
-N : [0, -N)
N : [N, N+1)
+N : [N+1, +∞)

  1. 查找/etc/目录下24小时内变更过的文件
find /etc -mtime -1
  1. 查找/etc/目录下1天前的当天内被变更过得文件
find /etc/ -mtime 1 
  1. 查找/etc/目录下1天前,不包括1天前的当天变更过得文件
find /etc/ -mtime +1
  1. 创建一个账号,观察其修改的文件
[centos7@root app]# useradd zhubiao; find /etc/ -mmin -1
/etc/
/etc/issue
/etc/group
/etc/gshadow
/etc/passwd
/etc/localtime
/etc/shadow

根据权限查找

-perm [-|/]MODE
MODE #精确匹配,匹配的文件权限与指定的一样
-MODE #每类对象(u,g,o)都包含指定的权限,0不考虑
/MODE #任意一类对象(u,g,o),其中一类包含指定的权限,0不考虑

  1. 查找根下一级目录中权限为1777的文件
[centos7@root app]# find / -maxdepth 1 -perm 1777 -ls
67160136 8 drwxrwxrwt 36 root root 4096 Aug 1 09:35 /tmp
  1. 查找/usr/sbin目录下包含SUID权限的文件
[centos7@root app]# find /usr/sbin -perm /4000 -ls
34105536 12 -rwsr-xr-x 1 root root 11224 Nov 6 2016 /usr/sbin/pam_timestamp_check
34105538 36 -rwsr-xr-x 1 root root 36280 Nov 6 2016 /usr/sbin/unix_chkpwd
34619979 40 -rws--x--x 1 root root 40312 Jun 10 2014 /usr/sbin/userhelper
34503001 12 -rwsr-xr-x 1 root root 11296 Nov 6 2016 /usr/sbin/usernetctl
34698184 112 -rwsr-xr-x 1 root root 113400 Nov 18 2016 /usr/sbin/mount.nfs

处理动作

  1. -print #默认处理动作,显示到屏幕
  2. -ls #类似于将查找的文件执行ls -l命令
  3. -delete #将查找到的文件删除
  4. -fls FILE_NAME #查找到的文件的长格式信息保存到文件FILE_NAME中,类似于对查找到的文件执行ls -l > FILE_NAME的操作
  5. -exec COMMAND {} \; #对查找到的没一个文件执行COMMAND命令的操作
  6. -ok COMMAND {} \; #对查找到的没一个文件执行COMMAND命令的操作,每操作一个文件,都询问用户是否要进行此操作

  7. 查找/etc/目录下面所有以.conf结尾的文件,并将其备份为压缩文件

find /etc/ -regextype posix-egrep -regex ".*\.conf$" -exec tar -cjf ./etc_conf.tar.bz2 {} \;