从C ++执行find时我到底错过了什么?

时间:2017-05-14 21:16:12

标签: c++

我的努力是在我的程序中使用一段代码来查找和复制系统中的某些文件。

我写的代码意味着:

void scan(int i)
{
pid_t parent = getpid();
pid_t pid = fork();

if (pid == -1)
{
    cout << "failed to fork" << endl;
    return;
}
else
{
    if(pid > 0)
    {
        int status;
        waitpid(pid, &status, 0);
    }
    else
    {
        if(i == 0)
        {
            execl("/usr/bin/find","find", "/", "-name", "'*.mp3'","-exec","cp","{}","/home/pi/Music","\\;",(char *)0);
            _exit(EXIT_FAILURE);
        }
    }
}

return; }

然而,系统会返回:

find: missing argument to `-exec'

我如何更正execl命令以执行此shell命令:

find / -name '*.mp3' -exec cp {} /home/pi/Music \;

2 个答案:

答案 0 :(得分:2)

TL; DR - 删除\\之前的;

在shell的上下文中,在将各个参数传递给find可执行文件之前解释命令。 ;是一个特殊字符,因此需要转义以便被解释为文字(因为它是一个特殊字符) - find实际上只需要;

但是,您没有在shell上传递参数 - execl将参数直接传递给目标可执行文件。因此,没有必要逃脱它。

正如@AndrewHenle在下面的评论中指出的那样,出于类似原因,您还需要从'删除'*.mp3'

答案 1 :(得分:0)

尽管有你的问题标题,但看不到Bash。但你正在使用Bash风格的引用。

"'*.mp3'"

除非您的名字中包含带引号的文件,否则find将找不到任何内容。使用"*.mp3"

"\\;"

find需要单个分号来终止-exec个参数。 \;是使用字面分号的Bash方式。通常,;是Bash中的保留字符。使用简单的";"