Wie RSYNC eine einzelne Datei?

93

Derzeit RSync-ing ich nur wie folgt Directories:

* * * * * rsync -avz /var/www/public_html/images root@<remote-ip>:/var/www/public_html

Wie gefällt mir rsynceine einzelne Datei /var/www/public_html/.htaccess?

夏 期 劇場
quelle

Antworten:

155

Sie tun dies genauso wie in einem Verzeichnis, geben jedoch den vollständigen Pfad zum Dateinamen als Quelle an. In Ihrem Beispiel:

rsync -avz /var/www/public_html/.htaccess root@<remote-ip>:/var/www/public_html/
Michael Place
quelle
19
Wenn Sie nur eine Datei senden, möchten Sie möglicherweise den Parameter "--progress" hinzufügen, damit Sie den Fortschritt verfolgen können.
JoshStrange
Bedeutet dies, dass Sie weiterhin ein Modul in rsyncd.conf mit einem Verzeichnis über der Datei benötigen (z. B. mit Löschoption löschen), oder können Sie Dateien irgendwo auf den Server hochladen, indem Sie nur den Pfad angeben? Die Manpage ist darüber nicht wirklich klar.
2
-a enthält rekursiv und das ist für eine einzelne Datei nicht erforderlich. Ich bin mir nicht sicher, ob ich dieses Flag für eine einzelne Datei verwenden würde, da es zu unbeabsichtigtem Verhalten führen kann, wenn der Dateiname versehentlich zu einem Verzeichnis wird.
Redanimalwar
2
--partial --stats --progress << Diese Flags sind hilfreich, wenn es sich um eine wirklich große Datei handelt, die nach einer unterbrochenen Übertragung möglicherweise wieder aufgenommen werden muss.
Ahi Thunfisch
16

Grundlegende Syntax

rsync options source destination

Beispiel

rsync -az /var/www/public_html/filename root@<remote-ip>:/var/www/public_html

Weiterlesen

Technikfreak
quelle
14

Die Antwort von Michael Place funktioniert hervorragend, wenn im Verhältnis zum Stammverzeichnis für Quelle und Ziel bereits alle Verzeichnisse im Dateipfad vorhanden sind.

Was aber, wenn Sie eine Datei mit diesem Quellpfad synchronisieren möchten:

/ source-root / a / b / file

zu einer Datei mit dem folgenden Zielpfad:

/ target-root / a / b / file

und die Verzeichnisse a und b existieren nicht?

Sie müssen einen rsync-Befehl wie folgt ausführen:

rsync -r --include="/a/" --include="/a/b/" --include="/a/b/file" --exclude="*" [source] [target]
Kenny Evitt
quelle
2
Wäre es nicht sicherer, die einzelne Datei einfach in einen vorhandenen Ordner zu kopieren oder die Ordner im Voraus zu erstellen? Im Falle der Synchronisierung von Ordnern oder Ordnerinhalten erstellen wir mit rsync alle Unterordner, schließlich ist es seine Arbeit, aber in diesem speziellen Fall ist es zu mühsam und schwierig, die Parameter --include nur zum Kopieren einzelner Dateien zu verwenden.
Tulains Córdova
@ user1598390 Ich bin mir nicht sicher, welches Szenario Sie annehmen oder sich vorstellen, wo dies weniger sicher wäre, aber wenn Sie versuchen würden, sich an die spezifische Form dieses Befehls zu erinnern, und Sie es nicht häufig getan haben, dann ist es wahrscheinlich weniger sicher als das Kopieren der einzelnen Datei. Es kann sicherer sein, wenn die Datei groß ist, dh weil rsync die meisten Fehler, die beim Kopieren auftreten können, automatisch behandelt. In einigen Fällen war meine Syntax für mich besonders nützlich, da ich Code geschrieben hatte, der Befehle in dieser Form generierte. Bei ausreichenden Tests, die den relevanten Code abdecken, sind diese Befehle "sicher".
Kenny Evitt
0

Bisher sind zwei der Antworten nicht ganz richtig, sie erhalten mehr als eine Datei, und die andere ist nicht so einfach wie es sein könnte. Hier ist eine einfachere Antwort, IMO.

Im Folgenden wird genau eine Datei abgerufen, Sie müssen jedoch das Zielverzeichnis mit mkdir erstellen. Dies ist wahrscheinlich die schnellste Option:

mkdir -p ./local/path/to/file
rsync user@remote:/remote/path/to/file/ -zarv --include "filename" --exclude "*" ./local/path/to/file/

Wenn sich in / remote / path nur eine Instanz der Datei befindet, kann rsync Verzeichnisse für Sie erstellen, wenn Sie die folgenden Schritte ausführen. Dies wird wahrscheinlich etwas länger dauern, da mehr Verzeichnisse durchsucht werden. Außerdem werden leere Verzeichnisse für Verzeichnisse in / remote / path erstellt, die sich nicht in ./local befinden

cd ./local
rsync user@remote:/remote/path -zarv --include "*/" --include "filename" --exclude "*" .

Beachten Sie, dass die Reihenfolge von - einschließen und - ausschließen wichtig ist.

Samuel
quelle