Wie synchronisiere ich ein Verzeichnis mit einem neuen Verzeichnis mit einem anderen Namen?

48

Ich mache eine Datenübertragung, das alte Dateisystem stützt sich stark auf ein Verzeichnis, das sich jetzt auf einem anderen Pfad befindet. Dies ist ein Git-Verzeichnis, in dem Code online gespeichert wird. Ich habe keine Rechte, es zu verschieben oder umzubenennen.

Ich kann dieses Verzeichnis also mit demselben alten Pfad synchronisieren. Aber auch der Verzeichnisname hat sich geändert.

Gibt es eine einfache Möglichkeit, ein Verzeichnis mit einem Zielverzeichnis mit einem anderen Namen zu synchronisieren?

Zen
quelle

Antworten:

82

Wenn Sie verwenden möchten, rsyncum das destVerzeichnis rekursiv zu einer exakten Kopie des srcVerzeichnisses zu machen:

rsync -a src/ dest

Die rsyncManpage erklärt, wie das funktioniert:

Ein abschließender Schrägstrich in der Quelle [...] vermeidet das Erstellen einer zusätzlichen Verzeichnisebene am Ziel. Sie können sich ein Trailing /auf einer Quelle als "Kopieren des Inhalts dieses Verzeichnisses" und nicht als "Kopieren des Verzeichnisses nach Namen" vorstellen. [...]

Adrian
quelle
3
Dies erstellt ein srcVerzeichnis unter destdirectory
Zen
7
@Zen, nicht in irgendeiner Version, die rsyncich jemals benutzt habe. Wenn Ihnen das tatsächlich passiert, fehlt der abschließende Schrägstrich am Ende des Quellverzeichnis-Arguments.
Adrian
3
Dieser hinterhältige Schrägstrich ist KEY ...
tutuca
leider ist dies nicht zu funktionieren scheint , wenn destein symlnk zu src, es stattdessen landet das Kopieren srczu src/src. Getestet unter macOS. Hatte gehofft , dass ich ersetzen könnte bar -> foo/mit bar/, aber ein Zwischen temporäres Verzeichnis verwenden musste.
user5359531
@ user5359531 Wenn Sie wissen, dass dies destein Symlink zu ist src, führen Sie einfach rm destden obigen Befehl aus. rsyncist schlau genug, um destvor dem Kopieren die Inhalte von zu erstellen src. Sie brauchen kein Zwischentemp-Verzeichnis.
Adrian
1

Wenn Ihr Computer sowohl auf das alte als auch auf das neue Dateisystem zugreifen kann, sollten Sie einen symbolischen Link anstelle von rsync verwenden. Wenn der von Ihnen verwendete Befehl rsync keine Hosts angibt (oder wenn es sich um denselben Host handelt), ist dies der Fall. Sie versuchen, zwei Verzeichnisse mit unterschiedlichem Namen auf demselben Host zu spiegeln. Verwenden Sie dazu nicht rsync, da Sie die Daten duplizieren und Ihren rsync häufig ausführen müssen, um sie synchron zu halten.

Die Verwendung eines symbolischen Links ist eine einmalige Korrektur, die zwei Verzeichnisse (mit unterschiedlichen Namen) spiegelt und fast keinen Speicherplatz benötigt. Es ist wie das Erstellen eines Aliasverzeichnisses, das auf ein anderes Verzeichnis verweist.

Nehmen wir an, Sie hatten den alten Git in einem Verzeichnis namens / old / path / old_git und jetzt ist das Code-Repository nach / new / path / new_git umgezogen

Du kannst tun:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

Dadurch wird ein Link als solcher erstellt:

/ old / path / old_git -> / new / path / new_git

Damit alles, was in new_git abgelegt wird, auch auf die alte Art und Weise sofort verfügbar ist, ohne Daten zu duplizieren und ohne sie ständig synchronisieren zu müssen.

jrel
quelle
1
Seien Sie vorsichtig mit dem Befehl rm -rf old_git. Dadurch wird Ihr gesamtes old_git-Repository entfernt. Wenn ich Ihr Problem nicht richtig verstehe, könnte dies eine schlechte Sache sein.
Jrel
0

Ich finde jetzt eine alternative Lösung.

Mit rysnc -r /origin/* /target/können Sie den gesamten Inhalt vom Ursprungsverzeichnis zum Zielverzeichnis synchronisieren.

Zen
quelle
8
Ich glaube , dass dies nicht enthalten Punkt (.foo) Dateien , da diese nicht mit dem Stern angepasst werden
Ray Burgemeestre
Das hängt von der Shell-Glob-Erweiterung ab. Technisch wird jede dort gefundene Datei als Argument an rsync übergeben. Es ist fast das gleiche wie Laufen rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Wie @RayBurgemeestre betonte, enthält die Shell-Glob-Erweiterung keine Punktdateien.
Florian Castellane