시스템이나 bash 없이 execv에서 와일드카드(c)를 사용하는 방법은 무엇입니까? [폐쇄]

시스템이나 bash 없이 execv에서 와일드카드(c)를 사용하는 방법은 무엇입니까? [폐쇄]

나는 사용하고 싶다

char *argv[] = {"rm", "-r", "/home/banana/Quest/*/", NULL};
execv("/bin/rm", argv);

C 파일의 Quest 폴더에 있는 모든 디렉터리를 삭제합니다. 하지만 와일드카드는 작동하지 않습니다. 시스템이나 bash 없이 이 작업을 어떻게 수행합니까? glob에 대해 들어본 적이 있지만 약간 혼란스럽습니다.

나는 다음과 같은 것을 시도했습니다 :

glob_t globbuf;
int err = glob("/home/solxius/modul2/petshop/*/", 0, NULL, &globbuf);
globbuf.gl_pathv[0] = "rm";
globbuf.gl_pathv[1] = "-r";
char *argv[] = {"rm", "/home/solxius/modul2/petshop/", NULL};
execvp("bin/rm", &globbuf.gl_pathv[0]);

하지만 작동하지 않습니다

답변1

음, glob()사용법은 간단해 보입니다. 물론 예를 들어 readdir()수동으로 수행 할 수 있습니다.fnmatch()

#include <glob.h>
#include <stdio.h>

/* run as 'globtest "*.txt"' */

int main(int argc, char *argv[])
{
    glob_t g;
    if (argc < 2) {
        printf("usage: %s <pattern>\n", argv[0]);
        return 1;
    }
    int ret = glob(argv[1], 0, NULL, &g);
    if (ret == 0) {
        printf("found %d matches:\n", (int) g.gl_pathc);
        for (int i = 0; g.gl_pathv[i]; i++) {
            printf("  %s\n", g.gl_pathv[i]); 
        }
    } else if (ret == GLOB_NOMATCH) {
        printf("no matches!\n");
    } else {
        printf("some error happened\n");
    }
}

물론, 문자열(문자열에 대한 포인터)을 execv()/ 에 전달된 배열에 복사해야 합니다 execve().

관련 정보