2012-03-19 7 views
6

Come si copiano solo collegamenti simbolici (e non il file a cui punta) o altri file utilizzando rsync?Come copiare solo collegamenti simbolici tramite rsync

ho cercato

rsync -uvrl input_dir output_dir

ma ho bisogno di copiare esclusivamente solo i link simbolici?

qualsiasi trucco utilizzando include opzioni di esclusione?

risposta

6

Per this question+answer, è possibile creare uno script come pipe. I pipe sono parte integrante della programmazione della shell e dello scripting della shell.

find /path/to/files -type l -print | \ 
    rsync -av --files-from=- /path/to/files [email protected]:/path 

Cosa sta succedendo qui?

Il comando find inizia da/percorso/a/file e passa in modo ricorsivo attraverso tutto "sotto" quel punto. Le opzioni per find sono condizioni che limitano ciò che viene generato dall'opzione -print. In questo caso, solo le cose di -type l (collegamento simbolico, secondo man find) verranno stampate per trovare "output standard".

Questi file diventano "input standard" dell'opzione --file-from del comando rsync.

Provatelo. Non ho effettivamente provato , ma mi sembra che dovrebbe funzionare.

+0

grazie darò una prova .... – Newbiee

+0

Questo non copierà i link simbolici come link simbolici, però. – Dan

+0

@Dan ... Bene, '-a' si traduce in' -rlptgoD', e '-l' è documentato in," quando si incontrano i collegamenti simbolici, ricrea il link simbolico sulla destinazione. " Quali risultati hai incontrato? – ghoti

4

È possibile generare un elenco di file esclusi legami con find input_dir -not -type l, rsync ha un'opzione --exclude-from=exlude_file.txt

si può fare in due fasi:

find input_dir -not -type l > /tmp/rsync-exclude.txt

rsync -uvrl --exclude-from=/tmp/rsync-exclude.txt input_dir output_dir

una linea bash :

rsync -urvl --exclude-from=<(find input_dir -not -type l | sed 's/^..//') input_dir output_dir

+0

grazie, ci provo .... – Newbiee

1

Si può fare più facilmente come:

find /path/to/dir/ -type l -exec rsync -avP {} ssh_server:/path/to/server/ \; 

EDIT: Se si desidera copiare i link simbolici della directory corrente solo senza che lo rende ricorsivo. Si può fare:

find /path/to/dir/ -maxdepth 1 -type l -exec rsync -avP {} ssh_server:/path/to/server/ \;