【问题标题】:What exactly am I missing in executing find from C++? [closed]从 C++ 执行 find 时我到底错过了什么? [关闭]
【发布时间】:2017-05-14 21:16:11
【问题描述】:

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

我写的代码是:

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 \;

【问题讨论】:

  • cout &lt;&lt; "failed to fork" &lt;&lt; endl 字符串文字不是 C 中 &lt;&lt; 的有效操作数。
  • 1) 这不是 C 代码 2) 您的问题与 C 或 C++ 无关。 3) 与编程无关。
  • @Olaf - 如果我只使用上面写的 find 命令,它工作正常。唯一的问题是将其转换为 execl 格式。所以我个人会说这与编程有关。
  • RTF(ine)M 怎么样?
  • @Olaf 不要太接近(粗鲁),我一直很糟糕,你知道 ;-)

标签: c++


【解决方案1】:

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

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

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


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

【讨论】:

  • 你打败了我。我认为它必须与反斜杠有关。 -name 参数中的 ' 字符可能也会混淆 find 的文件名通配符。
  • @AndrewHenle - 好电话!已更新答案。
  • 已解决,谢谢帮助
【解决方案2】:

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

"'*.mp3'"

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

"\\;"

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

【讨论】:

  • 非常感谢,问题解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2013-02-08
  • 2023-03-28
相关资源
最近更新 更多