2

我正在尝试将 rsync 包装在 NSTask 中并使用排除选项来不同步隐藏文件(点文件)。我知道这适用于命令行:

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 使用单独的数组元素 @"'.*'"

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

欢迎任何建议。

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 不需要转义空格。从文档中,“NSTask 对象将参数中的路径和字符串转换为适当的 C 样式字符串(使用 fileSystemRepresentation),然后通过 argv[] 将它们传递给任务)。参数中的字符串不会进行 shell 扩展,所以你不需要做特殊的引用,不会解析 $PWD 等 shell 变量。”

于 2014-10-02T15:42:55.413 回答
1

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

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

于 2011-01-13T21:40:16.990 回答