Параметр исключения обтекания в методе rsync NSTask - PullRequest
2 голосов
/ 14 января 2011

Я пытаюсь обернуть 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 с отдельным элементом массива @ "'. *'"

Ничто, похоже, не дает желаемых результатов.

Любые предложения приветствуются.

Ответы [ 2 ]

2 голосов
/ 02 октября 2014

Для всех, кто сталкивается с подобным вопросом, как исключить несколько файлов, оказывается, что вам нужен отдельный --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 []). Строки в аргументах не подвергнуться расширению оболочки, поэтому вам не нужно делать специальных кавычек, а переменные оболочки, такие как $ PWD, не разрешаются. "

1 голос
/ 14 января 2011

Попробуйте использовать только --exclude с отдельным аргументом @".*" (без одинарных кавычек).

Поскольку вы передаете аргументы непосредственно в задачу, вам не нужно заключать в кавычки или экранировать объектыкак вы бы в командной строке.Это потому, что в командной строке оболочка анализирует то, что вы печатаете, но в этом случае оболочки нет.

...