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


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

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

我写的代码是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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; }

不过,系统会返回:

1
find: missing argument to `-exec'

我怎样才能更正我的 execl 命令来执行这个 shell 命令:

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


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

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

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

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


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

1
"'*.mp3'"

您的 find 将一无所获,除非您的文件名称中带有单引号。使用 "*.mp3".

1
"\\\\;"

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