Проверьте, является ли файл символической ссылкой в 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
3 ответов:
чтобы определить, является ли запись каталога символической ссылкой, используйте следующее:
возвращает True, если path ссылается на запись каталога, которая является символьной ссылка на сайт. Всегда 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
для 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
без намерения раздувать эту тему, но я был перенаправлен на эту страницу, поскольку я искал символические ссылки, чтобы найти их и конвертировать их в реальные файлы и нашел этот скрипт в библиотеке инструментов 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's a symlink f_in = open(name, 'r') # This ensures it's 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")
Comments