← 前一天目录后一天 →

每日科普 · 2026-10-08 周四

考研 408 × 求职面试

知识点 · Linux · 基础

文件查找命令:find 与 locate

find 和 locate 都是 Linux 查文件工具,但思路不同。1)find:从指定路径开始实时遍历目录树,结果准确,能查最新文件;常配合条件:find /home -name '*.log' -type f -mtime -7,还可按大小、权限、用户查找,并用 -exec 或 -delete 做后续处理。缺点是目录大时慢。2)locate:查询预先建好的文件名数据库,通常由 updatedb 定期更新,所以速度极快;locate nginx.conf、locate -i readme 很方便。但它不是实时查找,新文件可能查不到,需先 sudo updatedb。3)选择:要精确、按属性过滤或做动作选 find;只需快速按文件名找已知文件选 locate。

每日一题 · Linux

文件查找命令:find 与 locate

关于 find 与 locate,下列说法正确的是( ) A. locate 会实时遍历磁盘目录,因此结果一定最新 B. find 依赖 updatedb 生成的数据库,速度通常比 locate 快 C. locate 查不到刚创建且未更新数据库的文件 D. find 只能按文件名查找,不能按大小、时间查找

解析

选 C。locate 查询预建数据库,数据库未更新时新文件不会被收录;find 才是实时遍历目录树。A 错,locate 不实时;B 错,find 不依赖数据库;D 错,find 支持 -name、-type、-size、-mtime 等丰富条件。易错点:locate 快但不实时,find 准但可能慢。

面试小贴士 · Linux

文件查找命令:find 与 locate

面试常问 find/locate 区别与场景。答:find 实时遍历、条件丰富、可执行动作;locate 查数据库、快但不实时。易错:把 locate 当实时,或忘记 updatedb。举例 find /var -name '*.log' -mtime -1。

代码实现 · C

代码示例

#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>

void find_file(const char *path, const char *name) {
    DIR *dir = opendir(path);
    if (!dir) return;
    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue;
        char full[1024];
        snprintf(full, sizeof(full), "%s/%s", path, entry->d_name);
        if (strcmp(entry->d_name, name) == 0) printf("%s\n", full);
        struct stat st;
        if (stat(full, &st) == 0 && S_ISDIR(st.st_mode)) {
            find_file(full, name); // 递归进入子目录,类似 find 的实时遍历
        }
    }
    closedir(dir);
}

int main(int argc, char **argv) {
    if (argc != 3) {
        fprintf(stderr, "用法: %s 目录 文件名\n", argv[0]);
        return 1;
    }
    find_file(argv[1], argv[2]); // 示例: ./find /home test.txt
    return 0;
}
← 前一天目录后一天 →