পাইথনটিতে ফাইল সিলেমিংক রয়েছে কিনা তা পরীক্ষা করুন


98

পাইথনে, কোনও প্রদত্ত ফাইল / ডিরেক্টরি একটি সিমলিংক কিনা তা পরীক্ষা করার জন্য কোনও ফাংশন রয়েছে? উদাহরণস্বরূপ, নীচের ফাইলগুলির জন্য, আমার মোড়ক ফাংশনটি ফিরে আসবে 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

উত্তর:


142

ডিরেক্টরি এন্ট্রি একটি সিমলিংক কিনা তা নির্ধারণ করতে:

os.path.islink (পথ)

সত্য যদি ফিরে আসুন তবে পাথটি এমন একটি ডিরেক্টরি এন্ট্রিকে বোঝায় যা প্রতীকী লিঙ্ক। প্রতীকী লিঙ্কগুলি সমর্থিত না হলে সর্বদা মিথ্যা।

উদাহরণস্বরূপ, প্রদত্ত:

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

8
উইন্ডোজে শর্টকাটগুলি এক্সটেনশন সহ ফাইল হিসাবে উপস্থিত হয় lnkএবং os.islink('a_shortcut.lnk')ফিরে আসে False
এভেজেনি সার্জিভ

4
@ এভেজেনিসারজিভ কারণ এটি কেবল ফাইল - সম্ভবত উইন্ডোজ 9x দিনগুলির একটি হ্যাংওভার যখন কেবলমাত্র ফাইল সিস্টেমটি ফ্যাট / ফ্যাট 32 ছিল। এনটিএফএসে সমর্থিত সমস্ত ধরণের প্রতীকী / হার্ড লিঙ্ক এবং ডিরেক্টরি জংশনের জন্য এই সুপারসার / প্রশ্ন / 347930/… দেখুন। এটি বলেছিল, আমি এখনও পাই না যে পাইথন তাদের সমর্থন করে।
জেএমসি

10
এবং ইসলিংক () উইন্ডোজ সিমলিংক, অর্থাৎ জংশনের জন্য কাজ করে না। সুতরাং উত্তরটি শুধুমাত্র ইউনিক্সের জন্য প্রযোজ্য।
গডফাদার

4
আপনার যদি উইন্ডোজ সমাধানের প্রয়োজন হয় তবে দয়া করে এই স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 27972776/… উত্তরটি দেখুন।
গডফাদার

4
@ দ্য গডফাদার: ডিরেক্টরি জংশনটি একটি সিমিলিংক ( IO_REPARSE_TAG_SYMLINK) নয়।
jfs

13

পাইথন ৩.৪ এবং তার বেশি বয়সীদের জন্য আপনি পাথ ক্লাসটি ব্যবহার করতে পারেন

from pathlib import Path


# rpd is a symbolic link
>>> Path('rdp').is_symlink()
True
>>> Path('README').is_symlink()
False

Is_syMLink () পদ্ধতিটি ব্যবহার করার সময় আপনাকে সতর্কতা অবলম্বন করতে হবে। এটি সত্যই ফিরে আসবে এমনকি লিঙ্কের লক্ষ্যটি অস্তিত্বহীন যতক্ষণ না নামযুক্ত বস্তুটি একটি সিমলিংক থাকে। উদাহরণস্বরূপ (লিনাক্স / ইউনিক্স):

ln -s ../nonexistentfile flnk

তারপরে, আপনার বর্তমান ডিরেক্টরিতে অজগর ফায়ার করুন

>>> from pathlib import Path
>>> Path('flnk').is_symlink()
True
>>> Path('flnk').exists()
False

প্রোগ্রামারকে সিদ্ধান্ত নিতে হয় যে সে আসলে কী চায়। পাইথন 3 মনে হয় প্রচুর ক্লাসের নাম পরিবর্তন করেছে। পাথ শ্রেণীর জন্য ম্যানুয়াল পৃষ্ঠাটি পড়া সার্থক হতে পারে: https://docs.python.org/3/library/pathlib.html


এই মায়া কেবল বৈধ সিমলিংক খুঁজে পায়, এই মায়া এমন একটি ফাইল সনাক্ত করতে পারে না যা একটি সিমলিংক তবে ভাঙা। সুতরাং আপনি যদি সত্যিকারের ফাইল বা সমস্ত সিমলিংকের জন্য ফিল্টারিং করছেন (ভাল এবং খারাপ) তবে আপনি অতিরিক্ত চেকগুলি নিশ্চিত করেছেন
2114L3

@ 2114L3 একটি বৈধ কিন্তু ভাঙ্গা সিমলিংক বলতে কী বোঝায়? একটি ভাঙ্গা সিমলিংকের সাহায্যে সাধারণ পরীক্ষা করা থেকে মনে হয় এটি is_symlink()সত্য এবং exists()মিথ্যা, যা আমি প্রত্যাশা করব। আপনি কি আপনার উদ্বেগের জন্য একটি উত্স দিতে পারেন?
জোনাথন এইচ

4
@ শেলজহান এই উত্তরটির সম্পাদনাগুলি পরীক্ষা করে দেখুন, আমার মন্তব্য উপস্থিত হওয়ার আগে () উত্তরের অংশ ছিল না। বিদ্যমান ব্যবহার করা মানে একটি অতিরিক্ত চেক যার অর্থ আমি বোঝাতে চাইছি। আসল সংস্করণ অনুযায়ী একা is_syMLink ব্যবহার করা যথেষ্ট নয়।
2114L3

উইন্ডোজে এটি আমার পক্ষে সঠিকভাবে কাজ করছে না: অস্তিত্বহীন ফাইলের জন্য is_symlinkফিরছে true(একইভাবে ফিরে exists()আসে true)।
জেমস হির্সকর্ন

3

এই বিষয়টি স্ফূরণ করার উদ্দেশ্য ব্যতীত, তবে আমি এই পৃষ্ঠায় পুনঃনির্দেশিত হয়েছিলাম কারণ আমি সিমলিংকগুলি সন্ধানের জন্য এবং তাদেরকে সত্যিকারের ফাইলে রূপান্তর করতে এবং পাইথন সরঞ্জাম লাইব্রেরির মধ্যে এই স্ক্রিপ্টটি পেয়েছি।

#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")

আপনি এখানে কি ঘটতে পারে তা ব্যাখ্যা করতে পারেন? এটিকে একপ্রকার অদ্ভুত দেখাচ্ছে বলে মনে হচ্ছে যে আপনি ফাইলটি আসলে ফিরে আসার আগে মুছে ফেলা (লিঙ্কমুক্ত) করছেন । এটা কিভাবে হতে পারে? এছাড়াও সর্বশেষটি mkrealfile(...)নিজস্ব ক্রিয়া হিসাবে একই স্তরে রয়েছে ...
not2qubit
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.