Na maioria das vezes, quando eu preciso copiar muitos links simbólicos, estou realmente tentando espelhar uma árvore de diretórios. Então eu quero os links simbólicos e tudo mais.
Isso é um exagero para copiar apenas alguns links simbólicos, mas se você estiver realmente tentando copiar uma árvore inteira, isso pode ser muito útil:
Use tar .
user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )
tar não resolve o symlink por padrão, então os links simbólicos na cópia espelhada apontarão para os mesmos locais que os da árvore original.
Este truque faz uso de subshells para colocar o comando tar na posição na raiz do diretório a ser espelhado; você pode deixar um deles fora (junto com o comando cd ) se você já estiver nos diretórios src ou dest :
# already in src?
user@host:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )
# already in dest?
user@host:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf -
# just need src/foo?
# this result will be a mirror copy at dest/foo
user@host:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )
# mirror to another system?
user@host:/src$ tar cf - . | ssh [email protected] '( cd /path/to/dest ; tar xf - )'
Novamente, isso não é apropriado para todas as vezes que você deseja copiar links simbólicos, mas é um snippet muito útil para saber.