execlp with find as parameter

时间:2013-10-21 17:15:16

标签: c linux find exec

我会尝试解释我的问题。如果我执行以下命令

find ~ -name file.txt

在Linux中,所有名为file.txt的文件都将显示在控制台屏幕上。我想创建一个C程序,它将执行相同的操作,使用execlp函数查找具有特定名称的所有文件,如file.txt

如果我这样做:

execlp("find","find","-name","file.txt",NULL); 

它编译得很好,但在执行时它只显示名称为file.txt的文件,该文件位于当前工作目录中。 如果我在我的程序中做了类似的事情:

execlp("find","find","~","-name","file.txt"); 

它编译得很好,但在执行时它给了我以下错误:

find: `~': No such file or directory. 

我应该为execlp函数提供哪些参数来搜索所有可用目录中的file.txt?我需要使用execlp函数执行此操作。 非常感谢你!

1 个答案:

答案 0 :(得分:1)

第一个示例中的“〜”由shell扩展,而不是内核。在C中执行命令时,您不会通过shell,因此您不能指望为您进行这种替换。好吧,除非您实际调用shell并要求它运行您的命令,如execlp("/bin/sh", "/bin/sh", "-c", "find", "~", ...);中所示。

执行您正在执行的操作的首选方法是检查HOME环境变量,或从密码数据库获取当前用户的主目录。这是怎么做的。

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdlib.h>

const char *homedir = getenv("HOME");
if (homedir == NULL) {
    struct passwd *pw = getpwuid(getuid());
    homedir = pw->pw_dir;
}

然后只需用homedir变量替换代码中的“〜”参数。