我目前正在使用一个代码示例,最初设计用于获取参数,然后在当前目录中搜索该参数,我试图通过替换它来搜索另一个目录(/ dev / shm to exact) “。”使用“/ dev / shm”但是当我搜索某些内容时代码没有任何内容*(请注意通配符)。外卡搜索在当前目录中工作正常,所以我不认为这是外卡是问题,如果有人可以帮助我,虽然我真的很感激,谢谢!
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
static void lookup(const char *arg)
{
DIR *dirp;
struct dirent *dp;
if ((dirp = opendir(".")) == NULL) {
perror("couldn't open '.'");
return;
}
do {
errno = 0;
if ((dp = readdir(dirp)) != NULL) {
if (strcmp(dp->d_name, arg) != 0)
continue;
(void) printf("found %s\n", arg);
(void) closedir(dirp);
return;
}
} while (dp != NULL);
if (errno != 0)
perror("error reading directory");
else
(void) printf("failed to find %s\n", arg);
(void) closedir(dirp);
return;
}
int main(int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++)
lookup(argv[i]);
return (0);
}
答案 0 :(得分:6)
opendir
不处理通配符。它需要一个真正的目录路径。当你说
通配符搜索在当前目录中工作
如果你的意思是它适用于你的shell,那是可以预料的。 shell将首先展开通配符,然后执行您键入的命令。
那么如何解决这个问题?在致电glob
之前,请使用opendir
自行展开通配符。
编辑:对不起,我以为你试图匹配目录名中的通配符。看起来您希望使用通配符匹配目录内容。在这种情况下,只需替换
if (strcmp(dp->d_name, arg) != 0)
与
if (fnmatch(arg, dp->d_name, 0) != 0)
您也可以使用glob
。它实际上会替换对opendir
和循环的调用。以下是使用glob
:
#include <glob.h>
#include <stdio.h>
static void lookup(const char *root, const char *arg)
{
size_t n;
glob_t res;
char **p;
chdir(root);
glob(arg, 0, 0, &res);
n = res.gl_pathc;
if (n < 1) {
printf("failed to find %s\n", arg);
} else {
for (p = res.gl_pathv; n; p++, n--) {
printf("found %s\n", *p);
}
}
globfree(&res);
}
int main(int argc, char *argv[])
{
int i;
for (i = 2; i < argc; i++)
lookup(argv[1], argv[i]);
return (0);
}
答案 1 :(得分:1)
我不确定你在期待什么。如果您的程序被称为lookup
,那么如果您在“当前目录”中调用它,那么该目录中的文件包含的东西为1,something.2和something.3,如下所示:
lookup something*
shell会将其扩展为
lookup something.1 something.2 something.3
并且您的程序将看到三个命令行参数,并且能够在readdir循环中找到匹配项。
如果将opendir调用更改为“/ dev / shm”并从原始目录(具有某些内容的那个。[1-3])调用它,则shell将再次展开通配符in the current directory
。但除非文件something.1,something.2和something.3也出现在/ dev / shm中,readdir循环将看不到它们。
请注意,您的查找功能有点奇怪。我希望它更像是这样:
static int lookup(const char * dir, const char *arg)
{
DIR *dirp;
struct dirent *dp;
if ((dirp = opendir(dir)) == NULL) {
perror(dir);
return -1;
}
while ((dp = readdir(dirp)) != NULL) {
if (!strcmp(dp->d_name, arg)) {
break;
}
}
(void) closedir(dirp);
printf("%s %s\n", dp ? "found" : "failed to find", arg);
return 0;
}