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

问题描述 投票:0回答:5

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

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

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

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

c linux shell system
5个回答
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可能返回...,它们也需要不被删除。


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
投票

你必须使用sh shell语法,你不是这样做的。


0
投票

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

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

或者你使用的任何外壳。


0
投票

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

另一种方法:

find . -prune ! -name svn | xargs /bin/rm -f
© www.soinside.com 2019 - 2024. All rights reserved.