如何在没有系统或 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()

相关内容