tutorial - python symlink windows
How to get symlink target in Python? (3)
Using Python, I need to check whether hundreds of symlinks are correct and recreate them when not. What I do now is to compare real paths of what I want and what I have, but it's slow because it's over NFS with an automount.
Otherwise I'm going to run a subprocess with the command 'ls -l' and work on the list of strings returned. I would prefer a better solution, using a Python library...
Edit1: I have:
link_name -> link_target and then
link_target -> a_real_file. What I need is to extract
a_real_file. I don't care if the real file does not exist.
Edit2: Maybe I did not express correctly. What I mean by a correct symlink is 'a link that point to a predefined path, even if it does not exist'. So I need to check that:
link_name_1 -> target_1 link_name_2 -> target_2
That's why I need to extract targets, not the real paths. Then I compare them to a reference (dictionary). So my question is: How do I extract the target path?
The problem with
os.readlink() is it will only resolve 1 step of the link. We can have a situation where
A links to another link
B link is dangling.
$ ln -s /tmp/example/notexist /tmp/example/B $ ln -s /tmp/example/B /tmp/example/A $ ls -l /tmp/example A -> /tmp/example/B B -> /tmp/example/notexist
Now in Python,
os.readlink gives you the first target.
>>> import os >>> os.readlink('A') '/tmp/example/B'
But in most situations I assume we are interested in the resolved path. So
pathlib can help here:
>>> from pathlib import Path >>> Path('A').resolve() PosixPath('/tmp/example/notexist')
For older Python versions:
>>> os.path.realpath('A') '/tmp/example/notexist'
To determine if a directory entry is a symlink use this:
Return True if path refers to a directory entry that is a symbolic link. Always False if symbolic links are not supported.
You need to look at