2013-05-20 12 views
34

Ich habe etwa 50 Dateien in verschiedenen Unterverzeichnissen, die ich an einen Remote-Server senden möchte. Ich dachte, dass rsync in der Lage sein würde, dies für mich mit der Option --include-from zu tun. Ohne die Option --exclude = "*" werden alle Dateien im Verzeichnis synchronisiert, mit der Option, keine Dateien sind.Wie rsync nur eine bestimmte Liste von Dateien?

rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ [email protected]:/var/www/ --dry-run 

Ich bin es zunächst wie trocken und 0.0.0.0 ist offensichtlich durch die IP-Adresse des Remote-Servers ersetzt. Der Inhalt von rsync_include.txt ist eine neue, durch Zeilen getrennte Liste relativer Pfade zu den Dateien, die ich hochladen möchte.

Gibt es einen besseren Weg, dies zu tun, entgeht mir an einem Montagmorgen?

Antwort

1

Sie könnten es leichter haben, wenn Sie sich für eine bestimmte Liste von Dateien suchen, sie direkt auf der Kommandozeile setzen statt:

# rsync -avP -e ssh `cat deploy/rsync_include.txt` [email protected]:/var/www/ 

Dies ist Voraussetzung dafür ist allerdings, dass Ihre Liste isn‘ t so lange, dass die Länge der Befehlszeile ein Problem sein wird und dass die Datei rsync_include.txt nur echte Pfade enthält (dh keine Kommentare und keine regulären Ausdrücke).

+2

Leider funktioniert dies nicht mit einer großen Liste oder mit Dateien mit Leerzeichen im Namen. –

+0

[Argumentliste zu lang] –

85

Es gibt eine Flagge --files-from, die genau das tut, was Sie wollen. Von man rsync:

--files-from=FILE 

Mit dieser Option können Sie die genaue Liste der Dateien angeben, zu übertragen (wie aus der angegebenen Datei oder lesen - für die Standardeingabe). Es zwickt auch das Standardverhalten von rsync nur die angegebenen Dateien und Verzeichnisse zu machen Übertragung einfacher:

  • Die --relative (-R) Option impliziert wird, die die Pfadinformationen erhält, die für jedes Element angegeben wird, in die Datei (benutze --no-relative oder --no-R, wenn du das ausschalten willst).

  • Die Option --dirs (-d) ist impliziert, die Verzeichnisse, die in der Liste auf dem Ziel angegeben sind, erstellt, anstatt sie geräuschvoll zu überspringen (verwenden Sie --no-dirs oder --no-d, wenn Sie möchten Schalt das aus).

  • Das Verhalten der Option --archive (-a) impliziert nicht --recursive (-r), also geben Sie es explizit an, wenn Sie es wollen.

  • Diese Nebeneffekte ändern den Standardzustand von rsync, sodass die Position der Option --files-from in der Befehlszeile keinen Einfluss darauf hat, wie andere Optionen analysiert werden (z. B. -a funktioniert vor oder) nach --files-from, wie auch --no-R und alle anderen Optionen.

Die Dateinamen, die aus der Datei gelesen werden, sind alle relativ zur Quelle dir - alle Schrägstriche werden entfernt und nicht „..“ Referenzen dürfen gehen höher als die Quelle Richt. Nehmen wir zum Beispiel diesen Befehl ein:

rsync -a --files-from=/tmp/foo /usr remote:/backup 

Wenn/tmp/foo die Zeichenfolge "bin" (oder auch "/ bin") enthält, das Verzeichnis/usr/bin Verzeichnis als/Backup/bin auf die erstellt werden Remote-Host. Wenn es "bin /" enthält (beachten Sie den abschließenden Schrägstrich), wird auch der unmittelbare Inhalt des Verzeichnisses gesendet (ohne explizit in der Datei erwähnt zu werden - dies begann in Version 2.6.4).In beiden Fällen, wenn die Option -r aktiviert war, würde die gesamte Hierarchie dieses Verzeichnisses ebenfalls übertragen werden (bedenken Sie, dass -r explizit mit --files-from angegeben werden muss, da dies nicht durch -a impliziert ist). Beachten Sie außerdem, dass die Option --relative (standardmäßig aktiviert) nur zum Kopieren der Pfadinformationen verwendet wird, die aus der Datei gelesen werden. Sie erzwingt in diesem Fall keine Duplizierung des Quellpfadpfads (/ usr) ).

Zusätzlich kann die Datei --files-from vom Remote-Host anstelle des lokalen Hosts gelesen werden, wenn Sie vor der Datei einen "Host:" angeben (der Host muss mit einem Ende der Übertragung übereinstimmen) . Als Abkürzung können Sie nur ein Präfix von ":" angeben, um "das entfernte Ende der Übertragung zu verwenden". Zum Beispiel:

rsync -a --files-from=:/path/file-list src:/ /tmp/copy 

Dies würde kopieren Sie alle angegebenen Dateien im Verzeichnis/Pfad/Datei-Liste-Datei, die auf dem Remote „src“ Host befand.

Wenn die Optionen --iconv und --protect-args angegeben sind und die Dateinamen von -files-from von einem Host an einen anderen gesendet werden, werden die Dateinamen vom Zeichensatz des sendenden Hosts zum Zeichensatz des empfangenden Hosts übersetzt .

HINWEIS: Wenn Sie die Liste der Dateien in der Eingabe --files-from sortieren, kann rsync effizienter sein, da so die Pfadelemente zwischen benachbarten Einträgen nicht erneut aufgerufen werden. Wenn die Eingabe nicht sortiert ist, werden einige Pfadelemente (implizierte Verzeichnisse) möglicherweise mehrmals gescannt, und rsync wird sie schließlich rückgängig machen, nachdem sie in in Dateilistenelemente umgewandelt wurden.

+6

Beachten Sie, dass Sie immer noch das Verzeichnis angeben müssen, in dem sich die aufgelisteten Dateien befinden, zum Beispiel: 'rsync -av --files-from = datei-list. Ziel/'zum Kopieren von Dateien aus dem aktuellen Verzeichnis. –

+4

Ja, und um es noch einmal zu wiederholen: 'Die Dateinamen, die aus der Datei gelesen werden, beziehen sich alle auf das Quellverzeichnis. – ash

+0

Ah, verpasste das, Entschuldigung! –

5

--files-from= Parameter benötigt einen Schrägstrich, wenn der absolute Pfad intakt bleiben soll. So würde Ihr Befehl so etwas wie unten wird:

rsync -av --files-from=/path/to/file//tmp/ 

Dies getan werden könnte, wie es eine große Anzahl von Dateien ist und Sie möchten alle Dateien x Pfad kopieren. So finden Sie die Dateien und Ausgabe in eine Datei wie folgt:

find /var/* -name *.log > file 
Verwandte Themen