How to copy symbolic links?

417,333

Solution 1

cp --preserve=links

From the man page:

   --preserve[=ATTR_LIST]
          preserve  the   specified   attributes   (default:   mode,owner-
          ship,timestamps),  if  possible  additional attributes: context,
          links, xattr, all

Personally, I use cp -av for most of my heavy copying. That way, I can preserve everything - even recursively - and see the output. Of course, that is just personal preference.

As to why your other options did not do what you expected, -s makes a link instead of copying and -L follows the links in the source to find the file to copy instead of copying the links themselves.

Solution 2

Just as the man page says, use -P. This setting says:

-P, --no-dereference
       never follow symbolic links in SOURCE

Solution 3

If the links contain relative paths, then, copying the link will not adjust the relative path. Use readlink, with the switch -f to follow recursively, in order to get the absolute path of the link. For example:

ln -s $(readlink -f old/dir/oldlink) new/dir/newlink

If preserving the relative paths is what you want, than the option -P of cp, as said by Ignacio Vazquez-Abrams, is what you need.

Solution 4

As a few have commented:

cp -a 

works well.

From the man:

-a    same as -dR --preserve=all

-R    copy directories recursively
-d    same as --no-dereference --preserve=links
--no-dereference   never follow symbolic links in SOURCE

Solution 5

Most of the time, when I need to copy many symbolic links, I'm actually trying to mirror a directory tree. So I want the symlinks and everything else.

This is overkill for copying just a few symlinks, but if you're actually trying to copy an entire tree, this can be very useful:

Use tar.

user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

tar doesn't resolve the symlink by default, so symlinks in the mirror copy will point to the same locations as those in the original tree.

This trick makes use of subshells to get the tar command into position at the root of the directory to be mirrored; you can leave one of them out (along with the associated cd command) if you're already in the src or dest directories:

# 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 - )'

Again, this isn't appropriate for every time you want to copy symbolic links, but it is a very useful snippet to know.

Share:
417,333

Related videos on Youtube

Basilevs
Author by

Basilevs

Physicist-programmer

Updated on September 17, 2022

Comments

  • Basilevs
    Basilevs almost 2 years

    I have directory that contains some symbolic links:

    user@host:include$ find .. -type l -ls
    4737414    0 lrwxrwxrwx   1 user group       13 Dec  9 13:47 ../k0607-lsi6/camac -> ../../include
    4737415    0 lrwxrwxrwx   1 user group       14 Dec  9 13:49 ../k0607-lsi6/linux -> ../../../linux
    4737417    0 lrwxrwxrwx   1 user group       12 Dec  9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
    4737419    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
    4737420    0 lrwxrwxrwx   1 user group       19 Dec  9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
    4737421    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat
    

    I need to copy them to the current directory. The resulting links should be independent from their prototypes and lead directly to their target objects.

    • cp -s creates links to links that is not appropriate behavior.
    • cp -s -L refuses to copy links to directories
    • cp -s -L -r refuses to copy relative links to non-working directory

    What should I do?

    • m-ric
      m-ric over 10 years
      cp -d made the job on my side.
    • Mirko
      Mirko about 9 years
      cp -R on a mac
  • Olivier 'Ölbaum' Scherler
    Olivier 'Ölbaum' Scherler about 11 years
    You might need to add -R, because otherwise cp will skip directories and symlinks to directories.
  • Mansuro
    Mansuro about 11 years
    I tried this on redhat and it doesn't work
  • Steve Tauber
    Steve Tauber almost 11 years
    on Mac -P does not work on directories so I used cp -a
  • Steve Tauber
    Steve Tauber almost 11 years
    on a Mac? use cp -a
  • Crowie
    Crowie over 10 years
    Properties look different. And unlike a regular link (as I see in /usr/bin e.g. java) I don't see the Link Target anymore when I open up the properties using Ubuntu GNOME Files or Nautilus or whatever it is I'm using
  • Siddhartha
    Siddhartha about 10 years
    Thanks, I've seen and benefited from your answer 3 times now different times over a year. Can't seem to remember it!
  • James Haigh
    James Haigh almost 10 years
    +1 for the -a option. Heh, I've looked up options in cp's manpage countless times, yet I must have always skimmed over this one. I have until now been using -dpr, but -a covers all of those, plus the preservation of a couple of other attributes. If I'd have needed these other attributes I would have probably looked up the --preserve option again and used -dr --preserve=all, which is exactly what -a is! Well at least I know now – -a is perfect and this is what I'll be using from now on.
  • Chloe
    Chloe almost 9 years
    This didn't work on Cygwin. --preserve=links wasn't enough. It still said cp: omitting directory. But -av worked.
  • hunse
    hunse about 8 years
    cp -d is the shorthand for this
  • R.M.
    R.M. almost 8 years
    This works, but my man page say "-P never follow symbolic links in SOURCE", which is not intuitively the same as "copy symlinks as symlinks to destination". ("never follow" makes it sound like it works in combination with -R)
  • Michael Scheper
    Michael Scheper over 7 years
    ... but only if none of the symlinks are to relative paths.
  • Job AJ
    Job AJ over 7 years
    @JamesHaigh on my mac, man cp says " -a Same as -pPR options. Preserves structure and attributes of files but not directory structure." That sounds pretty scary, like the main point of copying a folder structure is not preserved. What does it mean if not that it copies flat?
  • tommy.carstensen
    tommy.carstensen over 7 years
    This cp -P unlike the top voted answer by @kainosnous works for me. Thanks!
  • MarcusJuniusBrutus
    MarcusJuniusBrutus over 7 years
    on Ubuntu 16.04 --preserve=link doesn't do the trick. cp -a instead, succeeds.
  • Phiber
    Phiber about 7 years
    Works on Redhat. The accepted response not work !
  • don bright
    don bright almost 7 years
    tar is definitely more portable than cp in my experience
  • palswim
    palswim over 5 years
    I think both cp -a and cp --preserve=links do more than the question is asking. As I understand it, this is the correct answer for anyone using cp, though with files only (no directories) like in the question, --no-dereference would have no effect.
  • Sapience
    Sapience about 5 years
    On redhat/CentOS, cp -a works.
  • spioter
    spioter almost 5 years
    On an old solaris box my cp does not support -d. cp -rP worked for me; (idk the diff between -R and -r, -r works for me).
  • rosshjb
    rosshjb about 4 years
    --preserve=links vs --no-dereference ?
  • 1234ru
    1234ru over 3 years
    @spioter, -r and -R are the same, being shortcuts for --recursive
  • Caglayan DOKME
    Caglayan DOKME almost 3 years
    On Ubuntu 20.04, the --preserve=link trick works well.
  • Admin
    Admin about 2 years
    You may very well not want to modify a relative path. I have cases where there are different versions of a file (that is multiple files with different names), and a symbolic link to the latest version, and all stored in the same directory. Copying the whole directory I want the link unchanged so it still points to the file in its new location.
  • Admin
    Admin about 2 years
    True, but the OP question explicitely says: > The resulting links should be independent from their prototypes and lead directly to their target objects.