http://www.perlmonks.org?node_id=11110222


in reply to create a relative symlink

It's not clear to me what your issue is. If the target of the symlink is specified as a relative path, then then the symlink will be relative. Can you give a concrete example of your issue?

Dave.

Replies are listed 'Best First'.
Re^2: create a relative symlink
by Skeeve (Parson) on Dec 16, 2019 at 10:58 UTC

    Thanks for asking, Dave.

    The issue here is, that my script is not running in the directory where the target is. Currently the linking looks something like this

    my $newname="/home/script/data/archive/currentfile";
    my $targetfile="/home/script/data/archive/infofile-2019-12-16";
    symlink $targetfile, $newname;
    

    In order for the link to become relative I think I will have to do a chdir to the directory of $newname and make the path of $targetfile be relative to that.

    As both are in my case, in the same directory, the relative-path part is easy, but would it be different directories, it would be a bit more complicated.

    As the script is not running in the /home/script/data/archive directory, I think for symlink to create a working relative link, I need to do a chdir first. But then I need to change directory back as well.

    As the ln command has a "make a relative link" option, I thought there might be something available in perl as well. So in order not to reinvent the wheel, I'm asking…


    s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
    +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e
      my $newname="/home/script/data/archive/currentfile"; my $targetfile="infofile-2019-12-16"; symlink $targetfile, $newname;

        THANKS.

        Never thought that it's THAT easy.


        s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
        +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e
      to create a working relative link, I need to do a chdir first
      That would be the easiest way. However, it seems that you simply need to calculate the relative link (relative to the folder/directory where the symlink-to-be shall reside), e.g. with Path::Tiny->relative()
      my $newname="/home/script/data/archive/currentfile"; my $targetfile="/home/script/data/archive/infofile-2019-12-16"; # untested use Path::Tiny 'path'; my $newdir = path($newfile)->parent(); my $linktarget = path($targetfile)->relative($newdir); print ":$linktarget:\n"; symlink $linktarget, $newname;