আমি কীভাবে সিমলিঙ্কগুলি সম্পাদনা করতে পারি?


64

একটি সিমিলিংকের আমার প্রাথমিক উপলব্ধি একটি বিশেষ ফাইল হিসাবে রয়েছে, এমন একটি ফাইল যা অন্য কোনও ফাইলের স্ট্রিং পাথ ধারণ করে। কার্নেলের ভিএফএস অনেক দূরে বিমূর্ত করে তবে সিমলিংকগুলি সম্পাদনা করা অসম্ভব বলে মনে হচ্ছে এমন কোনও কারণ আছে কি?

অন্য কথায়: আমি কি একটি সিমলিংক সম্পাদনা করতে পারি? তা না হলে কেন?


আমি বুঝতে পারি যে সিমলিংকগুলি প্রতিস্থাপনের বিভিন্ন উপায় রয়েছে (দুটি বিকল্প বর্তমানে উত্তর বিভাগে রয়েছে) তবে প্রতিলিপিগুলি কেন প্রতিলিপিগুলির সাথে মোকাবিলা করার একমাত্র উপায় বলে মনে হচ্ছে তার একটি ব্যাখ্যা পাওয়া আকর্ষণীয় হবে। তারা যেখানে দেখায় সেখানে কেন আপনি পরিবর্তন করতে পারবেন না?


আপনার বোঝাপড়াটি কিছুটা সীমাবদ্ধ; একে 'ফাইল' বলা হওয়ার একমাত্র কারণ হ'ল এটির জন্য এর চেয়ে ভাল আর কোনও শব্দ নেই।
শাদুর

5
বিব্রতকর নৃশংসতার বিপরীতে যা উইন্ডোজ বৈকল্পিক, পিক্সিক-স্টাইলের প্রতীকী লিঙ্কগুলি ফাইল সিস্টেমের স্তরটিতেই / চালিত হয়। একটি সম্পাদনা করার একমাত্র উপায় হ'ল সরাসরি ফাইল সিস্টেম সম্পাদনা করা - এবং এটি সাধারণত এটির পক্ষে উপযুক্ত নয়।
শাদুর

@Shadur .lnk ফাইল সত্যিই (এবং এনটিএফএস দিয়ে শুরু করতে না symlinks হয় হয়েছে ভিস্তা থেকে সঠিক symlinks ছিল); কমান্ডগুলি কার্যকর করার ক্ষেত্রে তারা শর্টকাটের মতো, এটি কোনও নির্দিষ্ট ফোল্ডারে পরিবর্তিত হচ্ছে বা নির্দিষ্ট যুক্তি এবং একটি নির্দিষ্ট সিডাব্লুডি দিয়ে কোনও প্রোগ্রাম শুরু করা হোক।
জ্যাব

উত্তর:


36

প্রদত্ত যে -fকেবল নিঃশব্দ প্রতিস্থাপন করে, আপনি একটি পারমাণবিক প্রতিস্থাপনের সাথে mv -Tএটি করতে পারেন (-টি এটি /loc.../link ডিরেক্টরি হলেও এটি কার্যকর করে তোলে) :

ln -s /location/to/link linkname
# ... 
ln -s /location/to/link2 newlink
mv -T newlink linkname

linkname প্রক্রিয়া জুড়ে অ্যাক্সেসযোগ্য।


7
এটি আপনাকে পারমাণবিক প্রতিস্থাপন করে, যদিও আপনি এখনও সম্পাদনার পরিবর্তে প্রতিস্থাপন করছেন (নতুন লিঙ্কটিতে একটি নতুন ইনোড নম্বর রয়েছে)।
psusi

2
@ পিপুসি আমি সম্পূর্ণরূপে একমত, এটি কিছু পরিস্থিতিতে অন্যান্য উত্তরের চেয়ে প্রযুক্তিগতভাবে কিছুটা ভাল বিকল্প।
অলি

যদি আপনি লিঙ্কটিকে অন্য গন্তব্যে পুনর্নির্দেশ করে থাকেন তবে এর ইনোড নম্বরটি পরিবর্তন করা একটি ছোট পরিবর্তনের মতো বলে মনে হচ্ছে।
এমএস

4
এটি ধরে নিয়েছে যে linknameকোনও ডিরেক্টরিতে সিলেট লিঙ্ক নয়। এটি এড়ানোর জন্য জিএনইউতে থাকলে বা ফ্রিবিএসডি- তে -Tবিকল্পটি ব্যবহার করুন । মনে রাখবেন যে এর মতো লিঙ্কের অনুমতিগুলি সংরক্ষণ করা যায় না (এমন সিস্টেমে যেখানে তারা উল্লেখযোগ্য)। mv-hln -sf
স্টাফেন চেজেলাস

ডিরেক্টরির জন্য পরিবর্তন সিমবলিক লিঙ্ক আরেকটি সমাধান ব্যবহার করা -nঅপশন যেমন: ln -sfn DESTINATION_DIRECTORY LINK_NAMEAskubuntu.com/a/186227/69004
sobi3ch

22

যদি সম্পাদনা করে আপনি বোঝাতে চান যে ফাইলটি এটি নির্দেশ করে তবে আপনি হ্যাঁ করতে পারেন:

$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile

-fপ্যারামিটার ( --force) যখন Ln এটা ঘটায় ডাকতে প্রেরণ unlink()ডান আগে সিস্টেম কলsymlink()

নিম্নলিখিত স্ট্যাক ওভারফ্লো উত্তর থেকে নেওয়া ।


9
আমি লিঙ্ক (); সিমিলিংক (); যেহেতু এটিকে "সম্পাদনা" হিসাবে বিবেচনা করা যায় তবে এটি প্রশ্নবিদ্ধ মনে হয়; পারমাণবিক নয়, সুতরাং লিঙ্কটির অস্তিত্ব নেই এমন সময়ে একটি ক্ষুদ্র ক্ষুদ্র পরিমাণ রয়েছে।
পুনরায়

@ মুরো.স্টেটলার হ্যাঁ, আপনি ঠিক বলেছেন। তবে আমি অনুমান করি যে এটি আপনার দৃষ্টিভঙ্গির উপর নির্ভর করে। আপনি যদি কেবলমাত্র শেষ ফলাফলটিকে বিবেচনায় নেন, তবে সম্ভবত আপনি এটিকে সম্পাদিত হিসাবে বিবেচনা করতে পারেন, অন্য কোনও বিষয় বিবেচনা করা হয়নি।
NlightNFotis

1
ইউনিক্স টাইম শেয়ারিং সিস্টেম পেপারের উদ্ধৃত অংশটি হার্ড লিঙ্কগুলিকে বর্ণনা করে । এগুলি ওপি সম্পর্কে জিজ্ঞাসিত প্রতীকী লিঙ্কগুলি (সিমলিঙ্কগুলি) থেকে সম্পূর্ণ আলাদা।
আনসার এস্জেটারম্যান

4
মনে রাখবেন যে এটি ধরে নিয়েছে testএর লক্ষ্য কোনও ডিরেক্টরি নয়। অন্যথায় যে ডিরেক্টরিতে ln -s -f .profile testএকটি .profileসিমিলিংক তৈরি করা হবে । lnএটি -Tএড়ানোর জন্য জিএনইউর একটি বিকল্প রয়েছে ।
স্টাফেন চেজেলাস

9

প্রতীকী লিঙ্কগুলি পরমাণুভাবে সংশোধন করা দরকার। আপনি যদি সেগুলি লেখার অর্ধেক পথ ধরে রাখেন তবে সেগুলি কার্যকর হবে না। প্রতীকী লিঙ্কটির বিষয়বস্তু বেশ ছোট (লিনাক্সে সর্বাধিক 4095 অক্ষর: কোনও ফাইলের পাথের সর্বাধিক দৈর্ঘ্য), তাই কার্নেল স্তরের প্রতীকী লিঙ্কের অংশ সম্পাদনা করার ক্ষেত্রে সামান্য বিন্দু থাকবে। সুতরাং কার্নেল একটি প্রতীকী লিঙ্ক সম্পাদনা করার জন্য কোনও ইন্টারফেসের প্রস্তাব দেয় না, একটি নতুন ইন্টারফেস তৈরি করার জন্য কেবল একটি ইন্টারফেস, symlinkসিস্টেম কল ( unlinkযেকোন ফাইল সরানোর জন্য জেনেরিক ইন্টারফেস )।

symlinkসিস্টেম কল শুধুমাত্র একটি নতুন সিম্বলিক লিঙ্ক তৈরি করে, কোনো বিদ্যমান ফাইল মুছে যায় না। এটি বিরক্তিকর, তবে ফাইল তৈরির জন্য অন্যান্য সিস্টেমের কলগুলির সাথে সামঞ্জস্যপূর্ণ open(যা একটি নতুন ফাইল তৈরি করতে পারে বা একটি বিদ্যমান ফাইল কেটে ফেলতে পারে তবে একটি নতুন নির্মিত ফাইল দ্বারা একটি বিদ্যমান ফাইলকে প্রতিস্থাপন করতে পারে না) এবং mkdir

শেলটিতে, যেমন আপনি আবিষ্কার করেছেন , আপনি lnকমান্ডের সাহায্যে প্রতীকী লিঙ্কটি প্রতিস্থাপন করতে পারবেন না ( ln -sfপূর্ববর্তী ফাইলটিকে লিঙ্কযুক্ত করে প্রতীকী লিঙ্কটি তৈরি করে), আপনি প্রথমে একটি অস্থায়ী নামের অধীনে একটি প্রতীকী লিঙ্ক তৈরি করে এটি করতে পারেন এবং তারপরে এটি স্থানান্তরিত করুন।

tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"

2
mv -f(যেমন ln -sf) $linkকোনও ডিরেক্টরিতে নির্দেশ করলে আপনি যা চান তা করবে না । GNU ln এবং mv এর -Tজন্য একটি আছে । mv(সিস্টেম কল নামান্তর) হবে সবসময় এর inode পরিবর্তন $linkযখন ln -sfT(+ + সিমবলিক লিঙ্ক লিঙ্ক মুক্ত) একই পুনরায় ব্যবহার করতে পারেন।
স্টাফেন চেজেলাস

0

প্রযুক্তিগতভাবে, বিদ্যমান প্রতীকী লিঙ্কটি সম্পাদনা করার জন্য কোনও অন্তর্নির্মিত কমান্ড নেই। এটি কয়েকটি সংক্ষিপ্ত কমান্ডের সাহায্যে সহজেই অর্জন করা যায়।

বিদ্যমান প্রতীকী লিঙ্কটি আপডেট করার জন্য আমি এখানে একটি সামান্য বাশ / zsh ফাংশন লিখেছি:

# -----------------------------------------
# Edit an existing symbolic link
#
# @1 = Name of symbolic link to edit
# @2 = Full destination path to update existing symlink with 
# -----------------------------------------
function edit-symlink () {
    if [ -z "$1" ]; then
        echo "Name of symbolic link you would like to edit:"
        read LINK
    else
        LINK="$1"
    fi
    LINKTMP="$LINK-tmp"
    if [ -z "$2" ]; then
        echo "Full destination path to update existing symlink with:"
        read DEST
    else
        DEST="$2"
    fi
    ln -s $DEST $LINKTMP
    rm $LINK
    mv $LINKTMP $LINK
    printf "Updated $LINK to point to new destination -> $DEST"
}

দুঃখিত, তবে আপনি "উত্তর" জিজ্ঞাসা করা প্রশ্নের সাথে দূরবর্তীভাবে সম্পর্কিত।
ব্যবহারকারী2233709

হাই @ user2233709 - ব্যবহারকারীর প্রশ্নের " আমি কীভাবে সিমলিংকগুলি সম্পাদনা করতে পারি? " প্রথম বাক্যে এবং সমাধান সরবরাহ করে স্পষ্টভাবে উত্তর দেওয়া হয়েছিল। আপনি কি বিস্তারিত জানাতে যত্ন করবেন?
blizzrdof77

2
আপনি কি সত্যিই প্রশ্নটি পড়েছেন? এটি কোনও সিমলিংকটি প্রতিস্থাপনের পরিবর্তে পরিবর্তিত করা সম্ভব কিনা সে সম্পর্কে এটি। আপনার প্রস্তাবিত "সমাধান" এমন একটি স্ক্রিপ্ট যা একটি সিমিলিংকে প্রতিস্থাপন করে
ব্যবহারকারী2233709

0

ধরে নিন লিঙ্কনামটি (অতীতে) করার ফলস্বরূপ উপস্থিত রয়েছে:

 ln -s   /the/path/to/a/file   linkname

তারপরে, সিমলিংকটি পরিবর্তন করার জন্য তিনটি উপায় রয়েছে:

  • LN -fজোর করে এমনকি ডিরেক্টরিগুলির জন্যও ব্যবহার করুন -n(ইনোড আবার ব্যবহার করতে পারে):

    ln -sfn /some/new/path linkname
    
  • সিমলিংকটি সরান এবং একটি নতুন তৈরি করুন (এমনকি ডিরেক্টরিগুলির জন্যও):

    rm linkname; ln -s /some/new/path linkname
    
  • একটি নতুন সিমিলিংক তৈরি করুন, তারপরে mvএটি (এমনকি ডিরেক্টরিগুলির জন্যও পারমাণবিক পরিবর্তন):

    ln -s  /some/new/path newlinkname
    mv -fT newlinkname linkname             # linkname remains after the command
    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.