2011-01-13 7 views
2

Ich versuche, Rsync in NSTask zu umbrechen und die Ausschlussoption zu verwenden, um versteckte Dateien (Dot-Dateien) nicht zu synchronisieren. Ich weiß, das in der Befehlszeile funktioniert:Wrapping ausschließen Option in einer rsync NSTask-Methode

rsync -az --exclude='.*' source destination 

Mein NSTask ist wie folgt definiert:

NSTask *rsyncTask; 
rsyncTask = [[NSTask alloc] init]; 
[rsyncTask setLaunchPath: @"/usr/bin/rsync"]; 

NSArray *arguments; 
arguments = [NSArray arrayWithObjects: @"-az", @"--exclude='.*'", source, destination, nil]; 
[rsyncTask setArguments: arguments]; 

Ohne ausschließen Argument Dinge gut funktionieren. In der Tat funktionieren die Dinge gut mit der obigen Definition, aber versteckte Dateien werden immer noch kopiert.

Ich habe versucht:

  • die einzelnen Zecken mit einem Backslash
  • mit entkam doppelten Anführungszeichen
  • mit zwei umgekehrten Schrägstrichen dem entweichende Backslash
  • nicht mit --exclude = sondern nur zu entkommen --exclude mit einem separaten Array-Element, das ist @ "'. *'"

Nichts scheint die Ergebnisse zu bekommen, die ich will .

Alle Vorschläge willkommen.

Antwort

1

Verwenden Sie nur --exclude mit einem separaten Argument, das @".*" ist (ohne Hochkommas).

Da Sie Argumente direkt an die Aufgabe übergeben, müssen Sie keine Dinge quotieren oder vermeiden, wie Sie es in einer Befehlszeile tun würden. Das liegt daran, dass in der Befehlszeile die Shell analysiert, was Sie eingeben, aber in diesem Fall gibt es keine Shell.

+0

Super! Das hat es getan. Vielen Dank! – Wilersh

+0

Sie können auch weiterhin das einzelne Argument mit der gleichen Änderung aus dem gleichen Grund übergeben. In der ursprünglichen Befehlszeile verwendeten Sie einfache Anführungszeichen, um das Glob-Muster vor der Shell zu schützen, die darauf reagierte, indem sie die einfachen Anführungszeichen strich und nichts mehr tat. Da Sie jetzt nicht durch eine Shell arbeiten, brauchen Sie nichts mit einfachen Anführungszeichen zu schützen und nichts, um sie zu entfernen, also sollten Sie sie einfach weglassen: '@ '- exclude =. *" ' . –

2

Für jeden, der auf die Suche nach dem Ausschluss mehrerer Dateien stößt, stellt sich heraus, dass Sie für jede Datei/jedes Verzeichnis, das Sie ausschließen möchten, ein separates --exclude benötigen. In der Befehlszeile funktioniert das --exclude={file1,dir1/dir2,file2,dir1/dir\ with\ spaces} Muster, aber dieses Format spielt nicht gut mit NSTask. Für NSTask (swift) dies wäre:

task.arguments = ["-FLAGS", "--exclude", "file1", "--exclude", "dir1/dir2", "--exclude", "file2", "--exclude", "dir1/dir with spaces", "SRC", "DST"] 

Beachten Sie auch, dass NSTask keine Leerzeichen erfordert entkommen werden. Von der docs, "Das NSTask -Objekt konvertiert beide Pfad und die Strings in Argumenten in entsprechende C-Stil-Strings (mit FileSystemRepresentation) vor dem Übergeben sie an die Aufgabe über Argv []. Die Strings in Argumenten werden keine Shell-Erweiterung, so Sie müssen nicht speziell zitiert werden, und Shell-Variablen wie $ PWD werden nicht aufgelöst. "