在rsync NSTask方法中包装排除选项

时间:2011-01-13 21:36:48

标签: cocoa macos nstask

我正在尝试将rsync包装在NSTask中,并使用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];

没有exclude参数,一切正常。事实上,上面的定义工作正常但隐藏文件仍然被复制。

我试过了:

  • 使用反斜杠转义单个刻度
  • 使用转义双引号
  • 使用两个反斜杠来逃避逃避反斜杠
  • 不使用--exclude =但只是--exclude一个单独的数组元素@“'。*'”

似乎没有得到我想要的结果。

欢迎任何建议。

2 个答案:

答案 0 :(得分: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对象将参数中的路径和字符串转换为适当的C风格字符串(使用fileSystemRepresentation),然后通过argv []传递给任务。参数中的字符串不会经历shell扩展,所以你不需要做特殊的引用,并且没有解析shell变量,比如$ PWD。“

答案 1 :(得分:1)

尝试仅使用--exclude@".*"的单独参数(不带单引号)。

由于您将参数直接传递给任务,因此您无需像在命令行那样引用或转义。那是因为在命令行中,shell正在解析你键入的内容,但是在这种情况下没有shell。