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 \\; |
- 请注意,您不是在此处执行"Bash 命令"; find 独立于 Bash 存在。
-
cout <<"failed to fork" << endl 字符串文字不是 C 中 << 的有效操作数。
-
1)那不是 C 代码 2)你的问题与 C 或 C 无关。 3) 与编程无关。
-
@FreudianSlip - execl 的第一个参数是可执行路径。其余的是 args; argv[0] 按照惯例是可执行文件的名称。
-
@Olaf - 以什么方式与编程无关?
-
您不需要用 ' 引用字符串 '*.mp3'
-
@OliverCharlesworth:这是关于 Unix find 命令的,与本网站上下文中的编程无关。
-
@AndrewHenle - 如果您省略 \\\\\\\\ 之一,那么它将不会编译...
-
@Olaf - 如果我只使用上面写的 find 命令,它工作正常。唯一的问题是将其转换为 execl 格式。所以我个人会说这与编程有关。
-
@OliverCharlesworth 是的。我忘记了。我在尝试让代码中的一个反斜杠正确显示时遇到了太多麻烦。
-
我将删除我上面的??错误建议,以免造成混淆 - 对不起这个流浪汉。找到了这个 - 它可能会有所帮助:stackoverflow.com/questions/12596839/...
-
如果您的编译器足够现代,请考虑使用新的文件系统库。
-
@ZbyněkJak?:没有关于"execl 格式"的内容。您似乎已经理解每个参数都有一个参数。所以这是你需要理解的 find 参数的语法问题。 "如果我只使用上面写的 find 命令" 除了你只是使用了一个你并不真正理解的模式之外,什么也没说。
-
@Olaf 是的。因为这是我在这里的第一个问题。在为将来的目的提出这个问题时,您能否推荐一下应该做的不同的事情?谢谢 :)
-
RTF(ine)M 怎么样?
-
@Olaf 不要被边缘化(粗鲁),我一直很糟糕,你知道 ;-)
-
@π?ντα?ε?:OP 询问如何提出更好的问题。在询问之前进行研究是最好的方法。研究的第一个地址是手册/文档。那么这有什么不礼貌的呢?我故意不只是写一些人认为粗鲁的"RTFM"。如果有疑问,假设最坏的态度是非常糟糕的态度(我不是指你)。
TL;DR - 删除 ; 之前的 \\\\。
在 shell 的上下文中,在将单个参数传递给 find 可执行文件之前解释命令。 ; 是一个特殊字符,因此需要转义才能被解释为文字(因为它是一个特殊字符) - find 实际上只需要 ;.
但是,您没有在 shell 上传递参数 - execl 将参数直接传递给目标可执行文件。所以没有必要逃避它。
正如@AndrewHenle 在下面的评论中指出的那样,出于类似的原因,您还需要从 '*.mp3' 中删除两个 '。
- 你打败了我。我认为它必须与反斜杠有关。 -name 参数中的 ' 字符也可能会混淆 find 的文件名通配符。
-
@AndrewHenle - 好电话!已更新答案。
-
已解决,谢谢帮助
尽管您的问题标题,但看不到 Bash。然而你正在使用 Bash 风格的引用。
您的 find 将一无所获,除非您的文件名称中带有单引号。使用 "*.mp3".
find 需要一个分号来终止 -exec 参数。 \\; 是 Bash 使用文字分号的方式。通常 ; 是 Bash 中的保留字符。使用简单的 ";".