2011-01-13 3 views
2

rstyncをNSTaskでラップし、除外オプションを使用して隠しファイル(ドットファイル)を同期させようとしています。私は、これはコマンドラインで動作します知っている:rsync 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]; 

を物事が正常に動作除外引数なしで次のように

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

は私のNSTaskが定義されています。実際には、上の定義では正常に動作しますが、隠しファイルは引き続きコピーされます。

私が試してみました:

  • は、バックスラッシュ
  • を使用して--exclude =ちょうどないエスケープバックスラッシュをエスケープするために2つのバックスラッシュを使ってエスケープされた二重引用符
  • を使用して、単一のダニをエスケープ - 別の配列要素を除いて@ "'。*'"

何も結果が得られないようです。

答えて

1

@".*"(一重引用符なし)の別の引数を使用して、ちょうど--excludeを試してみてください。

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

+0

恐ろしい!それがそれでした。ありがとう! – Wilersh

+0

同様の理由で、同じ変更を加えた1つの引数を引き続き渡すこともできます。元のコマンドラインでは、一重引用符を使用してシェルからglobパターンを保護していました。シェルで作業しているわけではないので、一重引用符で保護する必要はありません。一重引用符で取り除く必要はありません。したがって、最初の場所に置いてください。 '@" - exclude =。* "' 。 –

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 [])を介してタスクに渡す前に、pathと引数の文字列を(fileSystemRepresentationを使用して)適切なCスタイルの文字列に変換します。特別な引用をする必要はなく、$ PWDなどのシェル変数は解決されません。

関連する問題