Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: create a relative symlink

by dave_the_m (Monsignor)
on Dec 16, 2019 at 08:15 UTC ( #11110222=note: print w/replies, xml ) Need Help??


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;

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11110222]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (3)
As of 2020-10-24 18:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My favourite web site is:












    Results (246 votes). Check out past polls.

    Notices?