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


in reply to Re: create a relative symlink
in thread create a relative symlink

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

Replies are listed 'Best First'.
Re^3: create a relative symlink
by ikegami (Patriarch) on Dec 16, 2019 at 11:17 UTC
    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
Re^3: create a relative symlink
by soonix (Canon) on Dec 16, 2019 at 11:22 UTC
    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;