locate命令和slocate命令都用来查找文件或目录

http://linux.51yip.com/search/whereis
索引的作用(为什么要有索引?):
当要对大数据文件进行随机 读取时,一种方法是先全部读入内存,以数组形式存储,通过数组索引下标形式进行访问,
缺点是要占用大量的内存,

如何使用索引提高文件的搜索速度

locate命令和slocate命令都用来查找文件或目录。
locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
语法
locate/slocate(选项)(参数)
选项
-d<目录>或–database=<目录>:指定数据库所在的目录;
-u:更新slocate数据库;
–help:显示帮助;
–version:显示版本信息。
locate的速度比find快,因为它并不是真的查找文件,而是查数据库
2. locate的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护
3. 升级数据库命令:locate – u

实例
搜索etc目录下所有以sh开头的文件:
locate /etc/sh
搜索用户主目录下,所有以m开头的文件:
locate ~/m
搜索用户主目录下,所有以m开头的文件,并且忽略大小写:
locate -i ~/m

用法: locate [OPTION]… [PATTERN]… 在mlocate数据库中搜索条目.

-b, --basename 匹配唯一的路径名称的基本文件名
-c, --count 只显示找到条目的号码
-d, --database DBPATH 用 DBPATH 替代默认的数据库(/var/lib/mlocate/mlocate.db)
-e, --existing 只显示当前存在的文件条目
-L, --follow 当文件存在时跟随蔓延的符号链接 (默认)
-h, --help 显示本帮助
-i, --ignore-case 匹配模式时忽略大小写区别
-l, --limit, -n LIMIT 限制为 LIMIT项目的输出 (或 计数)
-m, --mmap 忽略向后兼容性
-P, --nofollow, -H 当检查文件时不跟随蔓延的符号链接
-0, --null 输出时以 NUL 分隔项目
-S, --statistics 不搜索项目,显示有关每个已用数据库的统计信息
-q, --quiet 不报告关于读取数据库的错误消息
-r, --regexp REGEXP 搜索基本正则表达式 REGEXP 来代替模式
–regex 模式是扩展正则表达式
-s, --stdio 忽略向后兼容性
-V, --version 显示版本信息
-w, --wholename 匹配完整路径名 (默认)


Linux查找工具
Linux中的查找工具有两个:locate、find
locate:非实时查找,根据索引查找
find:实时查找,遍历所有文件进行条件匹配

locate
locate属于非实时查找,它根据事先构建的索引数据库,匹配文件信息进而定位符合条件的文件。
其需事先构建的索引数据库在/var/lib/mlocate/mlocate.db,索引的构建过程需要遍历整个根文件系统,极其耗费资源,因此其常常在系统较为空闲时进行(通常设置自动执行),也可以进行手动更新数据库命令为:updatedb
locate的工作特性:查找速度快、模糊查找、非实时查找
命令使用格式
locate [option]…PATTEN…
-b:只匹配路径中的基名
-c:统计出共有多少个符合条件的文件
-r:BRE(基本正则表达式)
12345678910111213141516171819202122232425 [root@localhost etc]# locate -c file2540[root@localhost etc]# locate -b pwd/etc/.pwd.lock/usr/bin/pwd/usr/bin/pwdx/usr/lib/modules/3.10.0-327.el7.x86_64/kernel/drivers/watchdog/hpwdt.ko/usr/lib64/cracklib_dict.pwd/usr/lib64/python2.7/lib-dynload/spwdmodule.so[root@localhost test]# locate -r ‘.*scrip2$’

如何使用索引提高文件的搜索速度
索引的作用(为什么要有索引?):
当要对大数据文件进行随机 读取时,一种方法是先全部读入内存,以数组形式存储,通过数组索引下标形式进行访问,
缺点是要占用大量的内存,

Linux中的查找工具有两个:locate、find
locate:非实时查找,根据索引查找
find:实时查找,遍历所有文件进行条件匹配

locate 模糊查找
locate的速度比find快,因为它并不是真的查找文件,而是查数据库
2. locate的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护

locate属于非实时查找,它根据事先构建的索引数据库,匹配文件信息进而定位符合条件的文件。
其需事先构建的索引数据库在/var/lib/mlocate/mlocate.db,索引的构建过程需要遍历整个根文件系统,极其耗费资源,因此其常常在系统较为空闲时进行(通常设置自动执行),也可以进行手动更新数据库命令为:updatedb
locate的工作特性:查找速度快、模糊查找、非实时查找
locate命令用来查找文件或目录。
如果想使刚创建的文件被locate命令搜索到,可以使用updatedb命令,更新数据库,之后在使用locate命令才能搜索到,否则要等到第二天才能搜索到该文件,该后台数据库默认一天更新一次
数据库所在位置: /var/lib/mlocate
locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。

cat /etc/updatedb.conf //–>配置文件
升级数据库命令:locate – u #注意之间有空格

命令使用格式

locate [option]
-w, --wholename 匹配完整路径名 (默认)
-i: 忽略大小写
-c:统 计出共有多少个符合条件的文件
-r:BRE(基本正则表达式)
-b:不检查路径只要包含就行
-b ‘\字符名’ 只找这个字符名的
默认搜索包含get的文件
locate get

搜索aa的文件计算个数
root@localhost etc]# locate -wc aa

搜索 /root 以aa结尾的文件
[root@localhost test]# locate -rw ‘.*a$’

查看etc目录下以a开头的文件,限定只显示5个,使用 -n
[root@localhost test]#locate -n 5 /etc/a

查找以/opt开头的目录,且只显示3行

locate -n 3 -r ^/opt

搜索 /root 以aa开头的文件
locate -r ^/root/aa

搜索etc目录下所有以sh开头的文件:
locate /etc/sh

搜索用户主目录下,所有以a开头的文件:
locate ~/a

搜索用户主目录下,所有以a开头的文件,并且忽略大小写:
locate -i ~/a

文件索引
索引的作用(为什么要有索引?):
当要对大数据文件进行随机 读取时,一种方法是先全部读入内存,以数组形式存储,通过数组索引下标形式进行访问,
缺点是要占用大量的内存,我们知道对计算机而言内存是相当宝贵的。
另一种方法就是建立文件索引,通过文件索引查找数据。思路:把每一行字符串的数据首地址记录下来,存入数组,再通过文件指针访问数组中的存储地址所指向的数据。

程序步骤
1.读取文件中一共有多少行数据
2.得到每行数据在文件中的地址
3.写入索引文件
4.载入索引文件到内存或者直接从索引文件读取每行数据所在的地址
5.随机读取想要读取的行数
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char path[256] = “D:\C++\test.txt”;
char indexpath[256] = “D:\C++\index.txt”;
#define N 8000000 //通过getN()得到行数
struct index
{
int *pindex; //地址
int length; //长度
}allindex;

int getN() //得到行数
{
int i = 0;
FILE *pf = fopen(path, “rb”);
if (pf == NULL)
{
return -1;
}
else
{
int i = 0;
int alllength = 0;
while (!feof(pf))
{
char str[50] = { 0 };
fgets(str, 50, pf);
i++;
}
//printf("\n all = %d", alllength);
fclose(pf);
return i;
}
}

void init(char *path) // 生成索引并写入到文件
{
printf(“索引数组开始分配 \n”);
allindex.length = N;
allindex.pindex = calloc(N, sizeof(int));
printf(“索引数组完成分配 \n”);
printf(“开始读取 \n”);
FILE *pf = fopen(path, “rb”);
if (pf == NULL)
{
return -1;
}
else
{
int alllength = 0;
for (int i = 0; i < N; i++)
{
char str[50] = { 0 };
fgets(str, 50, pf);
allindex.pindex[i] = alllength;
int length = strlen(str);
alllength += length;
}
fclose(pf);
}

printf("\n 结束读取");  
printf("\n 开始写入");  
FILE *pfw = fopen(indexpath, "wb"); //写入索引  
fwrite(allindex.pindex, sizeof(int), allindex.length, pfw);  
fclose(pfw);  
printf("\n 结束写入");  

free(allindex.pindex);  

}

void readindex() // 读取索引文件到内存
{
printf(“索引数组开始分配 \n”);
allindex.length = N;
allindex.pindex = calloc(N, sizeof(int));
printf(“索引数组完成分配 \n”);

printf("\n 开始读取");  
FILE *pfw = fopen(indexpath, "rb"); //写入索引  
fread(allindex.pindex, sizeof(int), allindex.length, pfw);  
fclose(pfw);  
printf("\n 结束读取");  

}

void main() //通过读索引到内存,再访问大数据文件读取数据
{
init(path);
readindex();
FILE *pf = fopen(path, “rb”);
while (1)
{
printf(“请输入要读取的行数”);
int num = 0;
scanf("%d", &num);
fseek(pf, allindex.pindex[num], SEEK_SET);

    char str[128] = { 0 };  
    fgets(str, 128, pf);  
    printf("%s", str);  
}  
printf("%d", getN());  
system("pause");  

}

void main1() //生成好索引后,直接从索引文件读取数据地址,再访问大数据文件读取数据
{
FILE *pf1 = fopen(indexpath, “rb”);
FILE *pf2 = fopen(path, “rb”);
while (1)
{
printf(“请输入要读取的行数”);
int num = 0;
scanf("%d", &num);

    int indexnum = 0;  
    fseek(pf1,num *sizeof(int), SEEK_SET);  
    fread(&indexnum, sizeof(int), 1, pf1);//读索引  

    fseek(pf2, indexnum, SEEK_SET);  
    char str[128] = { 0 };  
    fgets(str, 128, pf2);  
    printf("%s", str);  
}  
system("pause");  

}

whereis
相关命令:which,locate,find
whereis命令的语法:whereis [-bmsu] [BMS 目录名 -f ] 文件名
whereis命令的各选项含义如下:
-b 定位可执行文件。
-m 定位帮助文件。
-s 定位源代码文件。
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。
-B 指定搜索可执行文件的路径。
-M 指定搜索帮助文件的路径。
-S 指定搜索源代码文件的路径

猜你喜欢

转载自blog.csdn.net/qq_41703438/article/details/88938458