C系统函数导致错误'sh:语法错误:“(”意外“

时间:2010-11-02 11:35:45

标签: c linux shell system

我在Linux上用C编写了一个简单的程序来删除目录中的所有文件,除了一个名为svn的文件,如下所示:

  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     system("rm !(svn)");
  6     return 0;
  7 }

但是当我编译并运行它时,终端会说:sh: Syntax error: "(" unexpected

但是,当我直接在终端中输入并运行命令时,所有操作都正确完成。 有什么想法吗?

5 个答案:

答案 0 :(得分:4)

答案是不要使用system。使用Linux系统调用列出目录中的文件,并使用unlink()删除它们。类似的东西:

DIR* dirHandle = opendir(dirName);
struct dirent* dirEntry;
while ((dirEntry = readdir(dirHandle)) != NULL)
{
    if (strcmp(dirEntry->d_name, "svn") != 0)
    {
        unlink(dirEntry->d_name);
    }
}

警告:省略所有错误处理,未编译和测试,readdir可能会返回...,而且还需要删除。

答案 1 :(得分:4)

你可能需要使用它:

system("/bin/bash -c 'rm !(svn)'")

或可能:

system("/bin/bash -O extglob -c 'rm !(svn)'")

或:

system("find . -maxdepth 1 ! -name 'svn' -delete")

或类似。

但使用JeremyP's answer可能更好。

答案 2 :(得分:2)

您必须使用sh shell语法,而不是这样做。

答案 3 :(得分:0)

我想我只是将shell添加到系统命令:

system("/bin/csh rm !(svn)");

或你使用的任何外壳。

答案 4 :(得分:0)

解决方法:将文件移到目录外(例如/ tmp或..),全部删除,将其移回(使用多个system()调用执行)。

另一种方法:

find . -prune ! -name svn | xargs /bin/rm -f