1

Say under directory /usr/local/boost_1_52_0/stage/lib, I have a symbolic link: libboost_timer.so, which points to the regular file libboost_timer.so.1.52.0 in the same directory.

How can I cp the symbolic links to directory /usr/local/lib while pointing to the same file /usr/local/boost_1_52_0/stage/lib/libboost_timer.so.1.52.0.

I have searched and tried several options. First one copies the regular file to the destination directory using the name of the link. Second one just copies the link itself, but the link is not valid in the new directory. Third one makes new link points to the original link, so it would de-reference twice to get the regular file. And I want to use the link file name, so directly making the links of the regular file would not work.

How can I do this?

2
  • What is wrong with dereferencing twice?
    – Chris Down
    Jan 17, 2013 at 8:20
  • @ChrisDown If there's no simple way to do this, then I'll stick to de-referencing twice.
    – WiSaGaN
    Jan 17, 2013 at 8:37

1 Answer 1

2

The best way is to dereference twice, but I guess the fact that you mentioned it in your question implies that it isn't any good for your use case (why?).

The second best option you have in a standard bash shell is to use readlink -f (note, this will break if the filename contains trailing newlines, which is extremely unlikely, but possible).

#!/bin/bash
src="$1"
dest="$2"


fileLinkedTo=$(readlink -f "$src")
if [[ -d "$dest" ]]; then
    ln -s "$fileLinkedTo" "${dest%/}/${src##*/}"
else
    ln -s "$fileLinkedTo" "$dest"
fi

And then run it as:

./script /usr/local/boost_1_52_0/stage/lib/libboost_timer.so /usr/local/lib

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .