一、简介
Which:命令查找
Find:文件查找,针对文件名
Locate:文件查找,依赖数据库
二、命令文件查找
1.找到某些命令文件的位置
Which ls
Whereis ls
三、文件查找find
实时查找工具,通过遍历指定路径完成文件查找。
find [option] [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径。默认为当前目录。
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行。默认找出指定路径下的所有文件。
处理动作:对复合条件的文件做操作,默认输出至屏幕。
find /mnt -maxdepth 1
查找/mnt目录下的所有文件,不进入下一层。-maxdepth 最大深度,表示只进入路径下的前几层。
Find /mnt -maxdepth 2 -mindepth 2
查找/mnt目录下第二层目录下的所有文件。只在第二层目录下查找。-mindepth 最小深度。
Find /mnt -depth
先显示目录,再显示文件,默认查找显示结果,是先显示目录,再显示其下的文件。-depth可以先显示其下文件,再显示目录。
Find /mnt -name disk
在/mnt目录下,按照文件名disk1进行精确查找。
如果需要模糊查找,find /etc -name “pass”,表示查找/etc目录下包含pass字符的文件名。有些系统需要双引号才能正常使用通配符。
Find /usr/bin -iname “*.sh”
在/usr/bin目录下,查找.sh文件名结尾的文件。-iname,按照文件名查找,不区分大小写。
Find /etc -inum 107
在/etc目录下,查找107inode编号的文件。-inum,按照节点编号查找。
Find /usr/bin -samefile /bin/passwd
在/usr/bin目录下,查找和/bin/passwd这个文件相同inode编号的文件。
一般用于查找一个文件的硬链接文件。
Find /etc -link 5
查找在/etc目录下,链接数为5的文件。-links n,查找链接数。
Find /usr/bin/ -regex ‘.*.shKaTeX parse error: Can't use function '\.' in math mode at position 146: …则表达式,.*表示所有字符。 \̲.̲中\表示转义符,转义.的意思。…:$表示以什么结尾,这里是以sh结尾的意思。
Find /mnt -user root
查找在/mnt目录下所属者是root账户的文件。-user 指定所属者。
Find /mnt -group root
查找/etc目录下所属组是root组的文件。-group 指定所属组。
Find /mnt -uid 0
查找/etc目录下所属者的uid是0的文件。-uid 指定用户的uid。
Find /mnt -gid 0
查找/etc目录下所属组的gid是0的文件。-gid 指定所属组的gid。
Find /etc nouser
查找/etc目录下没有所属者的文件。
Find /etc/ nogroup
查找/etc目录下没有所属组的文件。
Find /etc/ -type TYPE
按照文件类型查找/etc目录下的文件。-type 按照文件类型查找。
f:普通文件,例:find / -type f
d:目录文件,例:find / -type d
l:符号链接文件,例:find / -type l
s:套接字文件,例:find / -type s
b:块设备文件,例:find / -type b
c:字符设备文件,例:find / -type c
p:管道文件,例:find / -type p
Find /etc -empty
在/data下面查找空文件。
Find /etc -type d -empty
在/etc下查找空目录。
Find /etc -path “/etc/sane.d” -a prune -o -name “*.conf”
查找etc下除去/etc/sane.d目录下的其余所有文件名尾缀是.conf结尾的文件
-path 路径,从这个路径中进行什么操作。-a 且,-prune 进行剪切,不显示。
-path “/etc/sane.d” -a -prune 选择路径/etc/sane.d目录并且进行剪切不显示。
组合条件:
与:-a
Find /etc -name “*.sh” -a -type f
查找/etc目录下文件名尾缀是.sh结尾的普通文件或:-o
Find /etc -name “*.sh” -o -type f
查找/etc下文件名尾缀是.sh结尾的文件或者/etc下的f普通文件。非:not,!
Find /etc ! -name “*.sh”
查找/etc下文件名不是.sh结尾的所有文件。部分特殊例子:
Find /mnt -name “*.sh” -o -type f -ls
-ls的优先级大于-o。所以查询出来的是/data下的普通文件并且显示具体出来。Find /etc ( -name “*.db” -a -type f ) -ls
将优先级用()括起来确认是-name -a -type,然后再进行-ls显示具体。/转义,否则系统不认为是()
find -not ( -user wang -name “*.txt” )
查找除了所属者是wang,并且尾缀是.txt的文件德·摩根定律
(非A)或(非B)=非(A且B)
(非A)且(非B)=非(A或B)
四、文件查找locate
文件查找,本身是外部命令(type locate)。
locate在最小化安装中是没有的,需要安装包
locate [option] [pattern(模式)]
locate文件查找,依赖一个mlocate的数据库,是在mlocate的小数据库中进行查找。
注意:mlocate数据库不是像平时操作文件那样,随时添加一个文件,删除一个文件就立马更新mlocate数据库。它不会随时更新,不是立即更新。这就表示如果是新文件,用locate是无法立即找到的。如果新建了某个文件或者删除了某个文件需要它立即更新,使用updatedb。直接敲出来回车即可。updatedb。
mlocate数据库其实在Linux中是一个文件,这个文件存放在/var/lib/mlocate/mlocate.db。就是这个文件。而updatedb就是对这个文件进行更新。updatedb后可以查看到这个文件的更新时间就是当前。
locate命令因为是查找的mlocate数据库,所以这个命令更多的是用于查找相对稳定,固定不变的文件。并且locate搜索都是模糊搜索。
注意:用locate后如果有通配符,例如:locate “*.sh”,有些系统是需要用双引号引起来的,否则Linux就认为是在当前目录下查找所有的.sh文件.
Locate -i “*.SH”
查找所有.sh结尾的文件,不区分大小写,-i 表示不区分大小写。
locate -n 3 -i “*.SH”
查找所有.sh结尾的文件,不区分大小写并且显示前三个。-n 3 表示返回结果集的前三个。
locate -r “.\sh$”
查找所有.sh结尾的文件。-r后面跟基础正则表达式。
locate和find的区别:
locate是基于mlocate数据库去搜索的,所以速度很快,不耗费性能。但是mlocate数据库不是实时更新的,新文件是找不到的。所以更多的用于固定,稳定不变的文件查找。
find是基于指定路径,实时的去磁盘分区中去完成查找文件的操作。是会影响一定性能的。查找速度略慢。但是精确查找、实时查找,需要注意,find查找,只搜索用户具备读取和执行权限的目录。