Проверьте, является ли файл символической ссылкой в python
В python существует функция проверки, является ли данный файл/каталог символической ссылкой? Например, для следующих файлов моя оберточная функция должна возвращать True
.
# ls -l
total 0
lrwxrwxrwx 1 root root 8 2012-06-16 18:58 dir -> ../temp/
lrwxrwxrwx 1 root root 6 2012-06-16 18:55 link -> ../log
Ответы
Ответ 1
Чтобы определить, является ли запись каталога символьной ссылкой, используйте это:
os.path.islink(путь)
Возвращает True, если путь относится к записи каталога, которая является символической ссылка. Всегда False, если символические ссылки не поддерживаются.
Например, данный:
drwxr-xr-x 2 root root 4096 2011-11-10 08:14 bin/
drwxrwxrwx 1 root root 57 2011-07-10 05:11 initrd.img -> boot/initrd.img-2..
>>> import os.path
>>> os.path.islink('initrd.img')
True
>>> os.path.islink('bin')
False
Ответ 2
Для python 3.4 и выше вы можете использовать класс Path
from pathlib import Path
# rpd is a symbolic link
>>> Path('rdp').is_symlink()
True
>>> Path('README').is_symlink()
False
Вы должны быть осторожны при использовании метода is_symlink(). Он вернет True, даже если цель ссылки отсутствует, если именованный объект является символической ссылкой. Например (Linux/Unix):
ln -s ../nonexistentfile flnk
Затем в вашем текущем каталоге запустите python
>>> from pathlib import Path
>>> Path('flnk').is_symlink()
True
>>> Path('flnk').exists()
False
Программист должен решить, что он/она реально хочет. Python 3, похоже, переименовал множество классов. Возможно, стоит прочитать страницу руководства для класса Path: https://docs.python.org/3/library/pathlib.html
Ответ 3
Без намерения раздуть эту тему, но я был перенаправлен на эту страницу, когда искал символическую ссылку, чтобы найти их и преобразовать в реальные файлы и нашел этот script в библиотеке инструментов python.
#Source https://github.com/python/cpython/blob/master/Tools/scripts/mkreal.py
import sys
import os
from stat import *
BUFSIZE = 32*1024
def mkrealfile(name):
st = os.stat(name) # Get the mode
mode = S_IMODE(st[ST_MODE])
linkto = os.readlink(name) # Make sure again it a symlink
f_in = open(name, 'r') # This ensures it a file
os.unlink(name)
f_out = open(name, 'w')
while 1:
buf = f_in.read(BUFSIZE)
if not buf: break
f_out.write(buf)
del f_out # Flush data to disk before changing mode
os.chmod(name, mode)
mkrealfile("/Users/test/mysymlink")