我正在尝试将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参数,一切正常。事实上,上面的定义工作正常但隐藏文件仍然被复制。
我试过了:
似乎没有得到我想要的结果。
欢迎任何建议。
答案 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。