2

NSTask で rsync をラップし、exclude オプションを使用して隠しファイル (ドット ファイル) を同期させようとしています。これはコマンドラインで機能することを知っています:

rsync -az --exclude='.*' source destination

私の NSTask は次のように定義されています。

NSTask *rsyncTask;
rsyncTask = [[NSTask alloc] init];
[rsyncTask setLaunchPath: @"/usr/bin/rsync"];

NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"-az", @"--exclude='.*'", source, destination, nil];
[rsyncTask setArguments: arguments];

除外引数がなければ、問題なく動作します。実際、上記の定義で問題なく動作しますが、隠しファイルは引き続きコピーされます。

私が試してみました:

  • バックスラッシュで単一の目盛りをエスケープする
  • エスケープされた二重引用符の使用
  • エスケープするバックスラッシュをエスケープするために 2 つのバックスラッシュを使用する
  • --exclude= を使用せず、@"'.*'" である別の配列要素で --exclude のみを使用する

私が望む結果が得られるものは何もないようです。

どんな提案でも大歓迎です。

4

2 に答える 2

2

複数のファイルを除外する方法を探してこれに出くわした人は、除外する--excludeファイル/ディレクトリごとに個別のファイルが必要であることがわかります。コマンド ラインではこの--exclude={file1,dir1/dir2,file2,dir1/dir\ with\ spaces}パターンは機能しますが、その形式は NSTask では適切に機能しません。NSTask (swift) の場合、次のようになります。

task.arguments = ["-FLAGS", "--exclude", "file1", "--exclude", "dir1/dir2", "--exclude", "file2", "--exclude", "dir1/dir with spaces", "SRC", "DST"]

また、NSTask ではスペースをエスケープする必要がないことにも注意してください。docsから、「NSTask オブジェクトは、argv[] を介してタスクに渡す前に、パスと引数の文字列の両方を (fileSystemRepresentation を使用して) 適切な C スタイルの文字列に変換します。引数の文字列はシェル展開を受けないため、特別な引用符を付ける必要はなく、$PWD などのシェル変数は解決されません。」

于 2014-10-02T15:42:55.413 に答える
1

(単一引用符なし--excludeで)別の引数だけを使用してみてください。@".*"

引数をタスクに直接渡すため、コマンド ラインの場合のように引用符やエスケープを行う必要はありません。これは、コマンド ラインでシェルが入力内容を解析しているためですが、この場合はシェルがありません。

于 2011-01-13T21:40:16.990 に答える