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

だから、私はここで何が欠けていますか?また、バックスラッシュをすべて一緒に削除しようとしましたが、「find:|:unknownprimaryoroperator」エラーが発生しました。

4

3 に答える 3

1

ヒントをありがとう。私はそれを分割し、今より多くの応答を得ています。バックスラッシュなしで & ソート & ヘッドなしでコマンドを実行すると、結果が得られます。

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

したがって、NSTask に '|' を入力するべきではないようです。文字。objc でソートなどを行います。

于 2012-12-20T16:47:47.507 に答える
0

実際には、呼び出すコマンド ライン プログラムが 3 つあります。

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

見つけて、並べ替えて、頭に入れます。

これらのコマンドごとに nstask を作成する必要があります。find の stdout を sort の stdin にリンクし、sort と head で同じことを行います。

docsによると、NSPipe を 1 つのアウトと別のインとして設定できるはずです。これが機能しない場合は、結果を引き戻して手動で次のものに渡すことができます。

確認していませんが、これらのプログラムを起動するために端末を通過しないため、バックスラッシュのエスケープは必要ないと思います。

于 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 に答える