web-dev-qa-db-ja.com

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
78
Bandicoot

ディレクトリエントリがシンボリックリンクかどうかを判断するには、次を使用します。

os.path.islink(path)

パスがシンボリックリンクであるディレクトリエントリを参照している場合、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
118
Levon

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

9
Kemin Zhou

このトピックを肥大化させるつもりはありませんでしたが、シンボリックリンクを探して実際のファイルに変換し、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")
3
user1767754