Linux笔记(二):搜索文件

698 查看

Linux内置了5个文件搜索命令。各有特色,满足不同场景下的需求。

$ whereis ls

这样就可以找到‘ls’命令和它的联机帮助文档所在的位置。where命令非常快,因为它是在专门的数据库中来查询(/var/lib/mlocate)。这个数据库是Linux系统自动创建,包含所有的本地文件信息,每天通过自动执行updatedb命令更新一次。因为这个原因,会使得whereis命令的结果有时候会不正确。如刚添加的文件可能找不到。刚刚删除的文件还在搜索结果中。如果需要获得准确的搜索结果,手动执行updatedb命令即可。

虽然whereis命令简单高效,但是功能有限。只能用于搜索可执行文件,联机帮助文件和源代码。如需要获得更全面的搜索结果可使用locate命令。它和wheris使用相同的数据库,,但locate使用了复杂的匹配语法。

$ locate ls

这样会匹配到文件名中和路径中出现过‘ls’的文件。因为结果太多,搜索结果太多,不能使用,需要使用精确搜索,可以这样:

$ locate -b "\ls"

这样会将所有文件名wei‘ls’的文件列出。
因为locate和whereis机制相同,所以会有相同的缺点。为了的速度,就会牺牲准确性。

相比以上两个,linux中更常用的查找命令时which,它在$PATH环境变量中指定的路径来搜索可执行文件。常用来它来确定系统中是否安装了制定的软件。如涌来确认是否安装gcc:

$ which gcc

如果有,会返回程序安装路径。如果没有,则会报错。

$ type if

从名字上看,看不出type拥有任何文件搜索能力。
type是用来判断一个命令是否属于shell内置的。如果是非内置的shell命令,使用了-p的选项,type就相当于世which命令了。。这么看来,type可以归属到搜索命令的范围内,

$ find

这是一个非常复杂的命令 。
直接写例子了。

$ find / -mtime 3 查找三天前发生变化的所有文件
$ find / -mtime -3 查询三天内发生变化的所有文件 
$ find / -mtime +3 查询三天以前发生变化的所有文件

类似对于这样精确的查询条件设置,find有太多太多了。这只是查询条件。
find不仅可以设置十分精确的查询条件。还能对找到的文件做什么动作。比如要列出一天以内变化文件的详细信息

$ find / -mtime -l -exec ls -l {} \;

重点说一下-exec以后的部分:
-exec是find命令对找到文件的执行动作,这个动作就是对找到文件的执行命令。这个执行命令就卸载它的后面,在上面的例子中是‘ls -l {}’。'{}'是一个占位符,在find命令的执行过程中会被不断的替换当前找到的文件。下一个疑惑点事结尾处的‘\;’。Liunx的联机帮助上说-exec的命令结束标记是';',如果在实际过程中,按照帮助文章中的编写,会出现报错,find不能执行。这是因为‘;’在bash环境中有特殊的含义,所以需要使用'\'来转义。