文章目录
- 前言
- find命令
- 命令格式:
- 常用选项:
- 举例使用
- locate命令
- 命令格式
- 使用实例
- whereis命令
- 使用过程:
- which命令
- type命令
前言
在linux系统中一切皆文件,此时我们想要从海量的文件中快速定位中我们想要的文件来,需要指定的命令来操作。以下为收集的各个命令,以及其优劣,使用方式。
find命令
centos下:rpm包
findutils-4.5.11-3.el7.x86_64
find是最常用也是最强大的查找命令,它可以查找任何类型的文件。
命令格式:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
常用选项:
-
:按文件名来查找文件-name
-
:按照文件的属主来查找文件-user
-
:按照文件所属的组来查找文件-group
-
:按照文件权限来查找文件-perm
-
:不在当前指定目录中查找-prune
举例使用
已知文件
stdio.h
存放在
/usr
大目录下的多个子目录,cd /usr目录下
find -name "stdio.h"
表示在当前目录查找文件名称为
stdio.h
的文件
find . -path ./include -prune -o -name "stdio.h"
在当前目录查及其子目录查找名称为
stdio.h
的文件,但是跳过include目录;
这里的-o参数表示或关系,即两者中只要有一个表达式满足true即可输出;
同
-a
和
-not
,
-a
表示只要有一个表达式不满足则不输出,
-not
表示对查找的结果进行取反
find . -path ./include -o -name "stdio.h" -print
将匹配到的内容文件输出到标准输出中
find / -user ceph
查找文件所有者为
ceph
的文件
find / -nouser -a -nogroup
查找系统中不属于任何人,任何用户组的文件(对于该部分文件需要保持警惕)
find /usr -mtime -4
查找文件更新日时在距现在时刻4天以内的文件
find /usr -mtime +4
查找文件更新日时在距现在时刻5天以上的文件
find /usr -mtime 4
查找文件更新日时在距现在时刻4天以上5天以内的文件
find / -type [c]
根据文件属性进行查找
其中[c]包括如下属性:
-
管道文件p
/run/systemd/initctl/fifo
-
block块设备文件,类似与/dev/sdb磁盘盘符这种b
-
字符设备,类似于c
/dev/tty63
-
directory 目录文件d
-
regular file 普通文件f
-
symbolic link 链接文件l
-
socket 套接字文件s
find / -size +10M
按照文件大小进行查找,+表示大于10M的文件,
-
表示小于10M的文件,同时还支持K,G,b(512B的块大小)的单位查找
locate命令
centos下:rpm包为
mlocate-0.26-5.el7.x86_64
locate命令实际是"find -name"的另一种写法,但是查找方式跟find不同,它比find快得多。
因为它不搜索具体目录,而是在一个数据库(
/var/lib/mlocate/mlocate.db
)中搜索指定的文件。次数据库含有本地文件的所有信息,此数据库是linux系统自动创建的,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,默认情况下为每天更新一次,所以用locate命令你搜索不到最新更新的文件,除非你在用locate命令查找文件之前手动的用updatedb命令更新数据库。
命令格式
locate [OPTION]... [PATTERN]...
主要使用的参数含义如下:
-
打印所有匹配到的文件-A
-
精确匹配需要查找的文件,即如果文件命中包含我们要查找的则不打印-b
-
仅打印匹配到文件个数-c
-
指定自己的文件数据库-d --database DBPATH
-
打印当前系统存在的想要查找的文件-e
-
忽略匹配出来的文件的差异-i
-
已经被忽略了,为了向后兼容-m
-
限制输出的条数-l count 或者 -n count
-
支持普通的正则匹配,类似-r
查找ceph-osd.后面有一个数字的文件locate -r ceph-osd.[0-9]
-
精确匹配,默认不加也是精确匹配-w
使用实例
这里关于参数详细的使用就不多说,以上都已经提到
这里简单说一下locate的正则匹配,基本的正则符号参考正则符号 举例:
locate -r ceph-osd.[0-9].log$
查找以包含
ceph-osd
的字符串,且在ceph-osd.和.log之间有一个数字,且以log字符串结尾的文件
我们在使用locate的很多时候发现一个新的文件locate不到,关于locate命令的基本查找过程上面也已经提到,因为locate的文件获取是从操作系统定时更新的数据库中获取,但是新的文件可能还没有更新到数据库(还没有被系统设置的定时任务去更新数据库),此时我们需要手动更新以下该数据库。
关于mlocate.db数据库的更新任务在路径为
/etc/cron.daily/mlocate
中,内容如下
#!/bin/sh
nodevs=$(< /proc/filesystems awk '$1 == "nodev" && $2 != "rootfs" { print $2 }')
renice +19 -p $$ >/dev/null 2>&1
ionice -c2 -n7 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "$nodevs"
我们做出如下测试
[root@node2 ~]# echo "i am a man" >test.cron
[root@node2 ~]# locate test.cro
[root@node2 ~]# updatedb 手动跟新数据库
[root@node2 ~]# locate test.cron 手动更新即可发现我们创建的文件已经存在
/root/test.cron
whereis命令
centos下的rpm包
util-linux-2.23.2-26.el7.x86_64
whereis命令只能用于搜索二进制文件(-b)、源代码文件(-s)、说明文件(-m)。如果省略参数则返回所有的信息
使用起来也是非常简单
使用过程:
[root@node2 ~]# whereis locate
locate: /usr/bin/locate /usr/share/man/man1/locate.1.gz
[root@node2 ~]# whereis -b locate
locate: /usr/bin/locate
[root@node2 ~]# whereis -m locate
locate: /usr/share/man/man1/locate.1.gz
[root@node2 ~]# whereis -s locate
locate:[root@node2 ~]#
该命令能够方便编译机上的组件以及对应源码的查找
which命令
[root@node2 ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/root/perl5/bin:/b_iscsi/bn_cli:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@node2 ~]# which locate
/bin/locate
type命令
[root@node2 ~]# type cd
cd is a shell builtin
[root@node2 ~]# type find
find is hashed (/bin/find)