Come risincronizzare una directory in una nuova directory con un nome diverso?


49

Sto facendo un trasferimento di dati, il vecchio file system si basa profondamente su una directory che ora si trova su un percorso diverso. Questa è una directory git che memorizza il codice online. Non ho i diritti per spostarlo o rinominarlo.

Quindi quello che posso fare è sincronizzare questa directory sullo stesso vecchio percorso. Ma anche il nome della directory è cambiato.

Esiste un modo semplice per sincronizzare una directory con una directory di destinazione con un nome diverso?

Risposte:


83

Se si desidera utilizzare rsyncper rendere ricorsivamente la destdirectory una copia esatta della srcdirectory:

rsync -a src/ dest

La rsyncpagina man spiega come funziona:

Una barra finale sull'origine [...] evita [...] la creazione di un livello di directory aggiuntivo nella destinazione. Puoi pensare a un trailing /su una fonte come "copia il contenuto di questa directory" invece di "copia la directory per nome" [...]


3
Questo creerà una srcdirectory nella destdirectory
Zen

7
@Zen, non in nessuna versione rsyncche abbia mai usato. Se ciò ti sta effettivamente accadendo, ti manca la barra finale alla fine dell'argomento della directory di origine.
Adrian,

3
Quella
sottile

purtroppo questo non sembra il lavoro se destè uno symlnk a src, finisce invece fino a copiare srca src/src. Testato su macOS. Speravo di poterlo sostituire bar -> foo/con bar/, ma ho dovuto usare una directory temporanea intermedia.
user5359531

@ user5359531 Se sai che destè un collegamento simbolico a src, semplicemente rm destprima di eseguire il comando sopra. rsyncè abbastanza intelligente da creare destprima di copiare il contenuto di src. Non hai bisogno di una directory temporanea intermedia.
Adrian,

1

Se il vecchio e il nuovo filesystem sono entrambi accessibili al tuo computer, allora considera di usare un link simbolico invece di rsync. Se il tuo comando rsync che stai utilizzando non specifica gli host (o se sono lo stesso host), allora è così. Stai tentando di eseguire il mirroring di due directory con un nome diverso sullo stesso host. Non utilizzare rsync per questo, poiché stai duplicando i dati e dovrai eseguire spesso rsync per mantenerli sincronizzati.

L'uso di un collegamento simbolico è una correzione una tantum che rispecchierà due directory (con nomi diversi) e non richiede quasi spazio. È come creare una directory alias che punta a un'altra directory.

Supponiamo che tu abbia il vecchio git in una directory chiamata / old / path / old_git e ora il repository di codice è stato spostato in / new / path / new_git

Tu puoi fare:

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

Questo creerà un collegamento come tale:

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

In modo che tutto ciò che viene inserito in new_git sia immediatamente disponibile anche alla vecchia maniera, senza duplicare i dati e senza doverli sincronizzare costantemente.


1
Fai attenzione con il comando rm -rf old_git. Questo rimuoverà l'intero repository old_git. Se non capisco bene il tuo problema, questa potrebbe essere una brutta cosa.
jrel

0

Ora trovo una soluzione alternativa.

Utilizzando è rysnc -r /origin/* /target/possibile sincronizzare tutti i contenuti dalla directory di origine alla directory di destinazione.


8
Credo che questo non includa i file punto (.foo) perché questi non saranno abbinati all'asterisco
Ray Burgemeestre

che si basa sull'espansione della shell glob, tecnicamente passerà ogni file trovato lì come argomento a rsync. è quasi uguale alla corsa rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Come sottolineato da @RayBurgemeestre, l'espansione shell glob non includerà i file dot.
Florian Castellane,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.