Copia symlink AND dove punta all'uso di rsync


11

Non ha bisogno di essere fatto da rsync, ma sarebbe bello non dover scrivere una sceneggiatura per farlo, ed rsyncè molto vicino a quello che voglio.

rsync -a(o -l) può preservare i collegamenti simbolici e -Lpuò dereferenziare i collegamenti simbolici e copiarlo come se fosse un normale file / dir. Tuttavia, è possibile mantenere il collegamento simbolico e anche copiare i file / directory a cui puntano i collegamenti?

Ecco un esempio Supponiamo di avere questa gerarchia di cartelle:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

e quando lo faccio rsync -aR dirA dest(o qualcos'altro), vorrei che questi appaiano esattamente in dest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

È possibile con rsync? Grazie.

Supponiamo che i collegamenti simbolici con percorso assoluto o che puntano all'esterno della directory di origine possano essere ignorati.


1
Penso che la tua richiesta sia sottostimata: è necessario che se si dirA/linktratta di un collegamento simbolico a ../dirB/file, questo dovrebbe essere gestito come copia dirB/fileda dest/dirB/filee dirA/linkverso dest/dirA/link. E se dirA/linkfosse un link a ../../another_file? Cosa succede, in generale, se dirA/linkpunta a una directory che si trova più in alto nella struttura di directory?
Riccardo Murri,

Buona pesca. Nel mio caso d'uso, non esiste un punto di collegamento all'esterno dell'albero e non esiste un percorso assoluto nei collegamenti.
Wei-Yin,

1
Più ci penso, più penso che nessuna utility standard lo farà. Nel caso generale, si potrebbe aver bisogno di creare un gran numero di destinazioni con una singola fonte, se si dispone di un link simbolico a un collegamento simbolico o più in generale un link simbolico la cui destinazione contiene un link simbolico (ad esempio a -> b, b -> c/foo, c -> d/e: una richiesta di copia adovrebbe anche copiare b, c, c/foo, d, d/ee d/e/foo).
Gilles 'SO- smetti di essere malvagio' il

@Gilles: Sì, hai ragione. I collegamenti di tracciamento potrebbero comportare l'inclusione di molti file, purché siano ancora all'interno della directory di origine.
Wei-Yin,

Risposte:


2

Se si conosce il nome del collegamento simbolico e si desidera trasferire il collegamento e la destinazione, è possibile:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

I primi rsynctrasferimenti solo il symlink. Il secondo comando trova il nome della directory reale e il secondo rsynctrasferisce il contenuto della directory.


0

Ciò sarebbe possibile se e solo se questi fossero tutti in "mydir" e dovessi sincronizzare "mydir" da un posto all'altro. Rsync non è in grado di copiare al di fuori del percorso indicato (ad eccezione dei seguenti collegamenti). per esempio

mydir/dirA ...
mydir/dirB ...
...

Sì, questo presupposto si adatta al mio caso d'uso. Tutti i collegamenti sono all'interno di mydir.
Wei-Yin,

@ Wei-Yin poi semplicemente dico di non seguire i symlink ... o ho frainteso qualcosa
xenoterracide

@xenoterracide: non importa come invochi rsync, penso che creerà una singola destinazione per ogni fonte (diversa dalla creazione delle directory principali). Ma Wei-Yin vuole creare due o più destinazioni: il collegamento e il suo obiettivo.
Gilles 'SO- smetti di essere malvagio'

apparentemente sono confuso ...
xenoterracide

@Gilles: non è necessario che rsync segua il collegamento simbolico, poiché sincronizzerà comunque il target . Quindi prima copia il collegamento simbolico, creando un collegamento simbolico penzolante. Quindi continua a copiare tutto il resto nella directory, inclusa la destinazione del collegamento simbolico. Voila, tutto si adatta bene.
Martin v. Löwis,
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.