我在Linux上用C编写了一个简单的程序来删除目录中的所有文件,除了一个名为svn
的文件,如下所示:
1 #include <stdio.h>
2
3 int main()
4 {
5 system("rm !(svn)");
6 return 0;
7 }
但是当我编译并运行它时,终端会说:sh: Syntax error: "(" unexpected
但是,当我直接在终端中输入并运行命令时,所有操作都正确完成。 有什么想法吗?
答案 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