【问题标题】:Wrapping exclude option in an rsync NSTask method在 rsync NSTask 方法中包装排除选项
【发布时间】:2011-01-13 21:36:48
【问题描述】:

我正在尝试将 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 与一个单独的数组元素@"'.*'"

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

欢迎提出任何建议。

【问题讨论】:

    标签: cocoa macos nstask


    【解决方案1】:

    对于遇到此问题并寻找如何排除多个文件的人来说,事实证明,您需要为要排除的每个文件/目录单独设置一个 --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 扩展,所以你不需要做特殊的引用,并且不会解析 $PWD 等 shell 变量。”

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 太棒了!做到了。谢谢!
      • 出于同样的原因,您还可以通过相同的修改继续传递单个参数。在最初的命令行中,您使用单引号来保护 glob 模式免受 shell 的影响,shell 的响应是去掉单引号并且什么也不做。由于您现在没有通过 shell 工作,因此您无需使用单引号保护任何内容,也无需将它们剥离,因此您应该首先将它们排除在外:@"--exclude=.*"。
      猜你喜欢
      • 2011-07-17
      • 1970-01-01
      • 2012-04-14
      • 2010-09-05
      • 2018-08-29
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2021-06-25
      相关资源
      最近更新 更多