c linux найти путь возврата команды напрямую - PullRequest
1 голос
/ 10 февраля 2012

есть простой способ прямого использования команды find и получения пути в качестве возврата
, а не чего-то подобного

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

или некоторой подобной команды, которая при выполнении через c возвращает путь

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Я предлагаю использовать 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

0 голосов
/ 10 февраля 2012

Можете ли вы попробовать вызовы dup или dup2 для достижения этой цели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...