我正在尝试在目录树中获取最新的修改日期。 这在终端中工作正常:
find . ! -path "*.git*" -exec stat -f "%m" \{} \; | sort -n -r | head -1
但是当我用NSTask尝试这个时,我得到了
find: -exec: no terminating ";" or "+"
在我正在使用的NSTask的args数组中,我转义了反斜杠:
NSArray *args = @[@".",
@"!",
@"-path",
@"*.git*",
@"-exec",
@"stat",
@"-f",
@"%m",
@"\\{}",
@"\\;",
@"|",
@"sort",
@"-n",
@"-r",
@"|",
@"head",
@"-1"];
那么,我在这里错过了什么?我也试图一起删除后退,但这给了我一个“发现:|:未知的主要或操作符”错误。
答案 0 :(得分:1)
感谢提示家伙。我已将它拆分并立即获得更多响应。运行没有反斜杠的命令时没有那种&我确实得到了结果。
NSArray *args = @[@".",
@"!",
@"-path",
@"*.git*",
@"-exec",
@"stat",
@"-f",
@"%m",
@"{}",
@";"];
所以看起来不应该给NSTask喂食'|'字符。 我只是在objc中进行排序等。
答案 1 :(得分:0)
您实际上有三个命令行程序,可以使用
调用find . ! -path "*.git*" -exec stat -f "%m" \{} \; | sort -n -r | head -1
找到,排序和领导。
你应该为每个命令创建一个nstask - 将find的stdout链接到sort的stdin,然后对sort和head执行相同的操作。
根据the docs,您应该能够将NSPipe设置为一个NSPipe而另一个设置为另一个,如果这不起作用,您可以将结果拉回来并手动将它们传递给下一个
虽然我没有验证它,但我认为您不需要反斜杠转义,因为这不会通过您的终端启动这些程序。
答案 2 :(得分:0)
想出了另一种方法。
我现在使用参数运行NSTask命令/ bin / sh:
NSArray *args = @[@"-c",
@"/usr/bin/find . ! -path \"*.git*\" -exec stat -f %%m \\{} \\; | sort -n -r | head -1"];
的信用