0

我正在尝试在目录树中获取最新的修改日期。这在终端中运行良好:

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"];

那么,我在这里缺少什么?我还尝试一起删除所有反斜杠,但这给了我一个“查找:|:未知的主要或操作员”错误。

4

3 回答 3

1

感谢您的提示。我已经把它分开了,现在得到了更多的回应。当运行没有反斜杠且没有排序和头部的命令时,我确实得到了结果。

NSArray *args = @[@".", 
              @"!", 
              @"-path", 
              @"*.git*", 
              @"-exec", 
              @"stat", 
              @"-f", 
              @"%m", 
              @"{}", 
              @";"];

所以看起来不应该喂 NSTask '|' 人物。我将在 objc 中进行排序等。

于 2012-12-20T16:47:47.507 回答
0

你实际上有三个你调用的命令行程序

find . ! -path "*.git*" -exec stat -f "%m" \{} \; | sort -n -r | head -1

查找、排序和查找。

您应该为这些命令中的每一个创建一个 nstask——将 find 的标准输出链接到 sort 的标准输入,然后对 sort 和 head 执行相同的操作。

根据文档,您应该能够将 NSPipe 设置为一个输出和另一个输入,如果这不起作用,您可以将结果拉回并手动将它们传递给下一个。

虽然我没有验证它,但我认为您不需要反斜杠转义,因为这不会通过您的终端来启动这些程序。

于 2012-12-20T16:42:26.303 回答
0

想出了另一种方法来做到这一点。

我现在运行带有参数的 NSTask 命令 /bin/sh:

NSArray *args = @[@"-c", 
                  @"/usr/bin/find . ! -path \"*.git*\" -exec stat -f %%m \\{} \\; | sort -n -r | head -1"];

归功于http://borkware.com/quickies/single?id=130

于 2012-12-20T17:42:18.413 回答