在C中模拟'find'命令

时间:2011-08-14 14:56:26

标签: unix find

在C编程语言中执行此操作的最佳方法是什么?

find fileName

3 个答案:

答案 0 :(得分:4)

查找POSIX函数nftw()。它被设计为“新文件树步行”功能。

您可能会使用相关但不是立即有用的函数scandir()。例如,选择函数可用于调用子目录上的递归扫描,但nftw()可能更合适。

答案 1 :(得分:2)

您可以从分叉的子进程中调用find并从管道中获取find的输出:

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

#define BUFSIZE 1000

int main(void) {
  int pfd[2], n;
  char str[BUFSIZE + 1];

  if (pipe(pfd) < 0) {
    printf("Oups, pipe failed.  Exiting\n");
    exit(-1);
  }

  n = fork();

  if (n < 0) {
    printf("Oups, fork failed.  Exiting\n");
    exit(-2);
  } else if (n == 0) {
    close(pfd[0]);

    dup2(pfd[1], 1);
    close(pfd[1]);

    execlp("find", "find", "filename", (char *) 0);
    printf("Oups, execlp failed.  Exiting\n"); /* This will be read by the  parent. */
    exit(-1); /* To avoid problem if execlp fails, especially if in a loop. */
  } else {
    close(pfd[1]);

    while ((n = read(pfd[0], str, BUFSIZE)) > 0) {
      str[n] = '\0';
      printf("%s", str);
    }

    close(pfd[0]);
    wait(&n); /* To avoid the zombie process. */

    if (n != 0) {
       printf("Oups, find or execlp failed.\n");
    }
  }
}

答案 2 :(得分:1)

这是一个复杂的话题。看看the GNU libc documentation。然后尝试使用scandir扫描当前目录。如果可行,您可以实现递归版本,假设您正在讨论UNIX查找命令并希望对文件名进行递归搜索。