![システムやbashなしでexecvでワイルドカード(c)を使用するには? [閉鎖]](https://linux33.com/image/14693/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%84bash%E3%81%AA%E3%81%97%E3%81%A7execv%E3%81%A7%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%EF%BC%88c%EF%BC%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
使いたい
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()
。