Linux如何高效查找文件
2019-12-11 本文已影响0人
ElephantKing
动机
Linux系统不同于windows,有那么丰富的工具可以使用。在windows下有强大到恐怖的文件搜索工具everything,速度之快,功能之强。在Linux系统中,尤其是字符界面系统,就只能用命令来查找文件,所以如何高效的查找文件,成为使用Linux的基础,一起来看看Linux查找文件的三种方式吧。
常用查找文件方式
- locate:
locate file_name
对Linux系统的所有文件,系统建立了一个数据库,位于/var/lib/mlocate/mlocate.db,记录了系统下的文件的位置。所以该命令就是去这个数据库里查找结果,速度可以说相当快。但是这里有个小问题是:因为该命令查找是去数据库查找结果,那么如果文件位置还没来得及入库,那就找不到了,比如刚刚创建的文件。根据系统的版本和设置不同,这个数据库自动更新的频率也不一样,一般为每天更新一次。如果要手动更新数据库,请使用updatedb命令,可能会花费一定时间哟。
- whereis:
whereis [-bms] filename
另一种风味的查找方式,该命令只在某些固定的文件夹下查找你需要的文件,这些文件夹分为三类,分别对应上面的-bms三个选项。其中-b就是可执行文件的意思,一般会在以下目录查找:
# whereis -b ls
/usr/bin
/usr/sbin
/usr/etc
/etc
/usr/local/bin
/usr/local/sbin
/usr/local/lib
...
同理-m选项是帮助文档的意思,一般会在以下目录查找:
# whereis -m file_name
/usr/share/man
/usr/share/man/zh_CN
/usr/shara/man7
...
-s选项是源码文档的意思,一般会在以下目录查找:
# whereis -s file_name
/usr/src/debug
/usr/src/kernels
...
如果我们要使用whereis命令查找文件的时候,最好先明确我们找的文件属于哪个类别,精确查找,否则还是先用locate命令查找以下吧。
-
find:
这个命令是功能最强大的,使用起来很方便,参数很多,功能很丰富,但是也有一些弊端。最常用的是可以根据文件名,文件时间,文件权限,文件大小来查找文件,并且可以使用这些条件的组合形式。
find ./ -maxdepth 2 -name "*.txt"
find ./ -type d -name "20100901"
find ./ -perm 755
find ./ -size +2k
并且可以用逻辑符号联结
find ./ -type d -and -name "20190901"
find ./ -name "*.txt" -or -name "*.log"
find ./ -name "*.txt" -not -size +2k
#更为细致的参数
find ./ -type TYPE
#TYPE可以是(不限于)以下几种:
#d:目录
#f:文件
#l:链接
find ./ -size SIZE
#SIZE可以是(不限于)以下几种:
#-2k:小于2KB
#+2k:大于2KB
#2k:等于2KB
#大小计量单位还可以是:k(KB) c(byte) M(兆字节) G(G字节)
find ./ -atime TIME
#TIME可以是以下几种:
#-2:2xx之内,xx是分还是天根据前面的参数确定,atime表示天,amin表示分钟
#+2:超过2xx
#2:第2xx
#除了atime(access),还有ctime(change state)、mtime(modify)
#cat more exec会改变atime,vi touch会改变三个时间,chmod chown会改变ctime
#找到文件之后
find ./ -perm 770 -exec cat {} \;
find ./ -name "*.txt" -exec cp {} /data \;
#-exec参数到\;结束,中间是后续执行的命令,{}表示find的结果
find ./ -name *.txt | xargs grep "wtf"
find ./ -name *.txt | xargs rm -rf
find命令的弊端在于,会扫描硬盘,费硬盘不说,速度也是三个命令中最慢的,所以一般情况不要在一个比较大的目录使用find,那会让你痛不欲生。
推荐情况
根据上面介绍的一些特点,在使用文件查找命令时,推荐如下:
- 如果查找的文件是系统产生的,或者系统自带的文件,请先用locate命令查找一遍,速度嘎嘎快,查一遍不亏。
- 步骤1不成功,说明文件不再数据库中,或者文件不存在。先别急着updatedb,这个时候使用whereis也基本没戏了,因为whereis命令查找的路径,基本上不会有什么重大更改,里面的文件理应全在数据库中。如果能锁定文件在某个较小的范围里,那就用find吧。否则就使用updatedb咯。
- 如果是用户自己编辑的文件,比如你写的代码,那就使用find命令咯,毕竟这个可以确定在某个较小的范围里了。而且此时用locate也大概率不奏效了。
- 总之:找自己的文件用find,找系统命令和帮助手册用whereis,在找之前先用locate从数据库里搜一遍。