在执行从C++中查找时,我到底缺少什么

What exactly am I missing in executing find from C++?

本文关键字:什么 执行 C++ 查找      更新时间:2023-10-16

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

我编写的代码是:

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 ;

TL;DR - 删除;之前的\

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

但是,您不会在 shell 上传递参数 - execl将参数直接传递给目标可执行文件。 所以没有必要逃避它。


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

尽管你的问题标题,但看不到Bash。然而,您使用的是 Bash 风格的引用。

"'*.mp3'"

您的find将找不到任何内容,除非您的文件名称中带有单引号。使用"*.mp3" .

"\;"

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