gpt4 book ai didi

c linux find命令直接返回路径

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:32 26 4
gpt4 key购买 nike

有没有简单的方法直接使用find命令获取路径作为返回
而不是这样的

            sprintf(inputPath, "find -name %s",fileNameList[i]);
fpop=popen(inputPath, "r");
fgets(inputPath, sizeof(inputPath)-1, fpop) ;
pclose(fpop);

或一些类似的命令,当通过 c 执行时返回路径?

最佳答案

我建议您自己使用 nftw() 进行查找,用 C 编写代码并没有那么多。简单的概念验证(使用 gcc test.c -o test 编译)

#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

static int s_argc;
static char** s_argv;

static int
display_info(const char *fpath, const struct stat *sb,
int tflag, struct FTW *ftwbuf)
{
int matched = 0, i;
for (i=0; i<s_argc; i++)
{
const char* match = strstr(fpath, s_argv[i]);
matched |= (match && *match
&& (strlen(match) == strlen(s_argv[i])) // matches at end
&& ((match == s_argv[i]) || (match[-1] == '/'))); // is full basename
}

if (matched)
{
printf("%-3s %2d %7jd %-40s %d %s\n",
(tflag == FTW_D) ? "d" : (tflag == FTW_DNR) ? "dnr" :
(tflag == FTW_DP) ? "dp" : (tflag == FTW_F) ? "f" :
(tflag == FTW_NS) ? "ns" : (tflag == FTW_SL) ? "sl" :
(tflag == FTW_SLN) ? "sln" : "???",
ftwbuf->level, (intmax_t) sb->st_size,
fpath, ftwbuf->base, fpath + ftwbuf->base);
}

return 0; /* To tell nftw() to continue */
}

int
main(int argc, char *argv[])
{
s_argc = argc-1;
s_argv = argv+1;

int flags = FTW_DEPTH | FTW_PHYS;

if (nftw(".", display_info, 20, flags) == -1)
{
perror("nftw");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}

为简单起见,我从当前工作目录(“.”)开始搜索。像这样使用:

./test target.txt b c

什么都不打印(假设你不存在这样的文件)

mkdir -pv a/b/c/{d,e,f,g}/subdir
touch a/b/c/{e,g}/subdir/target.txt
./test target.txt b c

现在打印:

f    6       0   ./a/b/c/e/subdir/target.txt              17 target.txt
f 6 0 ./a/b/c/g/subdir/target.txt 17 target.txt
dp 3 0 ./a/b/c 6 c
dp 2 0 ./a/b 4 b

您可以看到顺序是深度优先,但这很容易通过将标志调整为 nftw

来改变

关于c linux find命令直接返回路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9227248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com