文件查找 locate & find
文件查找(find, locate)
在Linux文件系统中快速、准确的搜索到自己想要的文件是运维人员的一项基本能力
在Linux系统中主要使用find和locate来查找文件,两者的区别如下
locate
基于数据库索引进行查找,查找文件速度快,是模糊查询,查找不够精确,同时数据库自动更新周期为每天一次,导致不能实时查找,可以通过手动更新数据库来达到实时查找,不过更新数据库将会搜索整个磁盘,耗费系统资源,当系统繁忙时是一件危险的操作。find
命令选项特别多,可以根据各种条件精确查找文件,通过搜索磁盘进行查找,属于实时查找,由于搜索磁盘,速度比locate
慢。
locate
locate [options] keyword
locate 查找包含关键词或正则表达式匹配的文件路径或文件名,然后输出文件的完整路径,所查找的文件需具有读、执行权限。
常用选项
-i | –ignore-cate #查找文件时忽略大小写
-r | –regexp REGEXP #使用基本正则表达式匹配文件路径
-n NUM #输出搜索到的前N个匹配的路径
实例
- 查找家目录下面包含.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
- 查找/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
- 查找家目录下以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的文件
- 查找/boot目录下包含字符串grub的文件
[centos6@root app]# find /boot -name "*grub*"
/boot/efi/EFI/redhat/grub.efi
/boot/grub
/boot/grub/grub.conf
- 在CentOS6系统上查找节点编号为2,但不包含/proc目录的文件
[centos6@root app]# find / -path "/proc" -prune -o -inum 2
/
/app
/proc
/boot
/sys/fs
/dev/pts/ptmx
- 在/etc 目录下查找以.config结尾,并且.config前面包含至少一个数字的文件
find /etc -regextype posix-egrep -regex ".*[[:digit:]]+\.config$" <=指定正则表达式类型为posix-egrep
/etc/pki/nss-legacy/nss-rhel6.config
指定搜索路径的层次
-maxdepth LEVEL #最大搜索路径深度,包括指定的搜索路径
-mindepth LEVEL #最小搜索路径深度,包括指定的搜索路径
- 查找/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 #查找没有属组的文件
- 查找当前目录下面用户名是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
- 查找 / 目录下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
- 查找整个系统中没有属主的文件
[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 : #管道文件
- 查找 /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
- 查找根下文件大于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, +∞)
- 查找/etc/目录下24小时内变更过的文件
find /etc -mtime -1
- 查找/etc/目录下1天前的当天内被变更过得文件
find /etc/ -mtime 1
- 查找/etc/目录下1天前,不包括1天前的当天变更过得文件
find /etc/ -mtime +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不考虑
- 查找根下一级目录中权限为1777的文件
[centos7@root app]# find / -maxdepth 1 -perm 1777 -ls
67160136 8 drwxrwxrwt 36 root root 4096 Aug 1 09:35 /tmp
- 查找/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
处理动作
-print
#默认处理动作,显示到屏幕-ls
#类似于将查找的文件执行ls -l命令-delete
#将查找到的文件删除-fls FILE_NAME
#查找到的文件的长格式信息保存到文件FILE_NAME中,类似于对查找到的文件执行ls -l > FILE_NAME的操作-exec COMMAND {} \;
#对查找到的没一个文件执行COMMAND命令的操作-ok COMMAND {} \;
#对查找到的没一个文件执行COMMAND命令的操作,每操作一个文件,都询问用户是否要进行此操作查找/etc/目录下面所有以.conf结尾的文件,并将其备份为压缩文件
find /etc/ -regextype posix-egrep -regex ".*\.conf$" -exec tar -cjf ./etc_conf.tar.bz2 {} \;