locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
语法
locate/slocate(选项)(参数)
选项
-d<目录>或--database=<目录>:指定数据库所在的目录;
-b:只匹配路径中的基名;
-c:统计出共有多少个符合条件的文件;
-r:BRE
-u:更新slocate数据库;
参数
查找字符串:要查找的文件名中含有的字符串。
实例
搜索etc目录下所有以sh开头的文件:
[root@localhost /]# locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shells
find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
语法
find(选项)(参数)
选项
-amin<分钟>:查找在指定时间曾被读取过的文件或目录,单位以分钟计算;
-atime<24小时数>:查找在指定时间曾被读取过的文件或目录,单位以24小时计算;
-cmin<分钟>:查找在指定时间之时被更改过状态的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改过状态的文件或目录,单位以24小时计算;
-daystart:从本日开始计算时间;
-depth:从指定目录下最深层的子目录开始查找;
-expty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-exec<执行指令>:假设find指令的回传值为True,就执行该指令;
-false:将find指令的回传值皆设为False;
-fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-help或——help:在线帮助;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;
-mmin<分钟>:查找在指定时间曾被更改过数据的文件或目录,单位以分钟计算;
-mount:此参数的效果和指定“-xdev”相同;
-mtime<24小时数>:查找在指定时间曾被更改过数据的文件或目录,单位以24小时计算;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true:将find指令的回传值皆设为True;
-typ<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-version或——version:显示版本信息;
-xdev:将范围局限在先行的文件系统中;
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。
参数
起始目录:查找文件的起始目录。
实例
查找当前目录以及子目录下所有文件和文件夹
find .
根据条件查找
查找系统中属于centos用户的文件和文件夹
find / -user centos
查找系统中属于centos组的文件和文件夹
find / -group centos
查找系统中匹配用户id的文件和文件名
find / -uid 1001
查找系统中匹配组id的文件和文件名
find / -gid 1001
查找系统中空的文件或文件夹
find / -empty
查找系统中没有属主的文件或文件夹
find / -nouser
查找系统中没有属组的文件或文件夹
find / -nogroup
查找系统中总是错误的文件
find / -false
查找系统中文件名为test的文件或文件夹
find / -name test
查找系统中文件名为.txt的文件名,忽略大小写
find / -iname "*.txt"
查找系统中 以.txt和.pdf结尾的文件
find / \( -name "*.txt" -o -name "*.pdf" \)
find / -name "*.txt" -o -name "*.pdf"
查找系统中匹配的文件路径或文件
find / -path "*local*"
根据时间戳查找
以天为单位(time):
-atime [+|-]#:
+表示(#+1)天之外被访问过
-表示#天之内被访问过
无符号:表示(#+1)>x>=#天的时间段被访问过
-mtime [+|-]#
-ctime [+|-]#
以分钟为单位:
-amin [+|-]#
-mmin [+|-]#
-cmin [+|-]#
查找系统中最后10分钟访问的文件或文件夹,对应时间戳(atime)
find / -amin -10
查找系统中最后24小时访问的文件或文件夹
find / -atime -1
查找系统中最后5分钟被修改过数据的文件或文件夹,对应时间戳(ctime)
find / -cmin -5
查找系统中最后24小时被修改过数据的文件或文件夹。
find / -ctime -1
查找系统中最后5分钟修改过状态的文件或文件夹,对应时间错(mtime)
find / -mmin -10
查找系统中最后24小时修改过状态的文件或文件夹
find / -mtime -1
根据文件大小查找
-size n[cwbkMG]
b:块,512个字节
w:2个字节的字
c:1字节
k:Kilobytes
M: Megabytes
G: Gigabytes
find / -size 100k //等于100k
find / -size +100k //大于100k
find / -size -100k //小于100k
根据文件类型查找
-type [bcdpfls]
b:块设备文件
c:字节设备文件
d:目录
p:命名管道文件
f:普通文件
l:符号连接
s:套接字文件
find / -type b
根据权限查找
-perm [+|-]MODE
mode:精确权限匹配;
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;
9位权限之间存在“或”关系;
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;
9位权限之间存在“与”关系;
find / -perm 777
处理动作
-print:输出至标准输出;默认的动作;
-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;
-delete:删除查找到的文件;
-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
-exec COMMAND {} \; :对查找到的每个文件执行由COMMAND表示的命令;
标准输出
[root@localhost /]# find / -type b
/dev/dm-1
/dev/dm-0
/dev/sr0
/dev/sda2
/dev/sda1
/dev/sda
ls 输出
[root@localhost /]# find / -type b -ls
10099 0 brw-rw---- 1 root disk 253, 1 3月 19 10:31 /dev/dm-1
9985 0 brw-rw---- 1 root disk 253, 0 3月 19 10:31 /dev/dm-0
9810 0 brw-rw---- 1 root cdrom 11, 0 3月 19 10:31 /dev/sr0
9742 0 brw-rw---- 1 root disk 8, 2 3月 19 10:31 /dev/sda2
9741 0 brw-rw---- 1 root disk 8, 1 3月 19 10:31 /dev/sda1
9693 0 brw-rw---- 1 root disk 8, 0 3月 19 10:31 /dev/sda
delete 删除
[root@localhost /]# find / -type f -user centos -name test12
/tmp/test12
[root@localhost /]# find / -type f -user centos -name test12 -delete
保存到指定文件
[root@localhost /]# find / -type b >/tmp/findtype
[root@localhost /]# cat /tmp/findtype
/dev/dm-1
/dev/dm-0
/dev/sr0
/dev/sda2
/dev/sda1
/dev/sda
exec COMMAND {} \;将30天前的.log文件移动到/tmp/log/目录中
[root@localhost /]# find . -type f -mtime + 30 -name "*.log" -exec cp {} /tmp/log \;
[root@localhost /]# ll /tmp/log
总用量 1940
-rw-------. 1 root root 49226 3月 19 15:31 anaconda.log
-rw-r--r--. 1 root root 11890 3月 19 15:31 change.log
-rw-------. 1 root root 1780 3月 19 15:31 ifcfg.log
-rw-------. 1 root root 1604054 3月 19 15:31 journal.log
-rw-------. 1 root root 0 3月 19 15:31 ks-script-v9DpKT.log
-rw-------. 1 root root 117566 3月 19 15:31 packaging.log
-rw-------. 1 root root 31591 3月 19 15:31 program.log
-rw-r--r--. 1 root root 61 3月 19 15:31 rpm.log
-rw-------. 1 root root 129575 3月 19 15:31 storage.log
-rw-------. 1 root root 22809 3月 19 15:31 X.log
查找/var目录下属主为root,且属组为mail的所有文件或目录;
[root@localhost /]# find /var -user root -a -group mail -ls
16778190 0 drwxrwxr-x 2 root mail 45 3月 19 11:37 /var/spool/mail
查找/usr目录下不属于root, bin或hadoop的所有文件或目录
[root@localhost /]# find /usr ! -user root -a ! -user bin -a ! -user hadoop -ls
17113097 0 drwx------ 2 polkitd root 6 11月 6 2016 /usr/share/polkit-1/rules.d
[root@localhost /]# find /usr ! \( -user root -o -user bin -o -user hadoop \) -ls
17113097 0 drwx------ 2 polkitd root 6 11月 6 2016 /usr/share/polkit-1/rules.d
查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录
find /etc -mtime -7 -a ! \( -user root -o -user hadoop \) -ls
find /etc -mtime -7 -a ! -user root -a ! -user hadoop -ls
查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录
find / -atime -7 -a -nouser -a -nogroup -ls
find / -atime -7 -a (-nouser -o -no group ) -ls
查找/etc目录下大于1M且类型为普通文件的所有文件
[root@localhost /]# find /etc -type f -size +1M -exec ls -lh {} \;
-rw-r--r--. 1 root root 3.6M 11月 12 2016 /etc/selinux/targeted/active/policy.kern
-rw-r--r--. 1 root root 1.4M 11月 12 2016 /etc/selinux/targeted/contexts/files/file_contexts.bin
-rw-r--r--. 1 root root 3.6M 11月 12 2016 /etc/selinux/targeted/policy/policy.30
-r--r--r--. 1 root root 7.0M 4月 11 2017 /etc/udev/hwdb.bin
查找/etc目录下所有用户都没有写权限的文件
[root@localhost /]# find /etc -type f ! -perm /222 -ls
33725312 192 -r--r--r-- 1 root root 194984 4月 11 2017 /etc/pki/ca-trust/extracted/java/cacerts
50398498 340 -r--r--r-- 1 root root 346654 4月 11 2017 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
96774 256 -r--r--r-- 1 root root 262042 4月 11 2017 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
96775 204 -r--r--r-- 1 root root 208874 4月 11 2017 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
96776 208 -r--r--r-- 1 root root 208976 4月 11 2017 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
--------
查找/etc目录至少有一类用户没有执行权限的文件
find /etc -type f ! -perm -111 -ls
查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所w有文件
find /etc/init.d -type f -perm -113 -ls