আমি কীভাবে প্রচুর ভাঙা প্রতীকগুলি "রিলিঙ্ক" করতে পারি?


54

আমি একটি ডিরেক্টরি ট্রি যার অধীনে ফাইলগুলিতে সিম্বলিক লিঙ্ক একটি গুচ্ছ আছে আছে /home... কিন্তু, আমি সরানো হয়েছে /homeথেকে /mnt/homeএবং symlinks সবগুলি "পুনঃলিঙ্ক" করার একটি উপায় প্রয়োজন। এই জাতীয় কার্যকারিতা বিদ্যমান বা এটি করার জন্য আমার কী কোনও স্ক্রিপ্ট লিখতে হবে?

উদাহরণ হিসাবে, আমার নীচের মতো কিছু রয়েছে:

[root@trees ~]# ls -l /mnt/home/someone/something
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/e

/mnt/home/someone/something/subdir:
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e

আমি একটি কমান্ড চাই যা সমস্ত সিমলিংকগুলি সন্ধান করবে এবং একই জায়গায় পুনরায় সংযুক্ত হবে তবে /mnt/homeপরিবর্তে নীচে/home

এ জাতীয় আদেশ কি বিদ্যমান?

উত্তর:


55

প্রতীকী লিঙ্কটি পুনরুদ্ধার করার কোনও আদেশ নেই, আপনি যা করতে পারেন তা হ'ল এটি অপসারণ করুন এবং অন্যটি তৈরি করুন। ধরে নিই আপনার জিএনইউ ইউটিলিটি রয়েছে (যেমন- এম্বেডড লিনাক্স বা সাইগউইনের অধীনে), আপনি -lnameপ্রাথমিকটি findতাদের লক্ষ্যের সাথে প্রতীকী লিঙ্কগুলি মেলে, এবং readlinkলিঙ্কের বিষয়বস্তু পড়তে ব্যবহার করতে পারেন । অপরীক্ষিত:

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$0")" "$0"' {} \;

এই প্রতীকী লিঙ্কগুলি আপেক্ষিক করা ভাল হবে। একটি সুবিধাজনক ছোট্ট ইউটিলিটি রয়েছে যার নাম symlinks(মূলত মার্ক লর্ডস, এখন জে। ব্র্যান্ড্ট বাকলে রক্ষণাবেক্ষণ করেছেন), অনেকগুলি লিনাক্স বিতরণে উপস্থিত। সরানোর আগে বা উপরের মতো বৈধ লিঙ্কগুলি পুনরুদ্ধার করার পরে, symlinks -c /mnt/home/someone/somethingনির্দিষ্ট ডিরেক্টরি অনুসারে সমস্ত পরম সিমলিংকগুলিকে কোনও ফাইল সিস্টেমের সীমানা অতিক্রম না করা পর্যন্ত নির্দিষ্ট ডিরেক্টরি অনুসারে আপেক্ষিক সিমলিংকে রূপান্তর করতে চালান ।


কোনও অপরাধ নয়, এটি দুর্দান্ত ওয়ান-লাইনার, তবে বাশের স্ট্রিং প্রতিস্থাপনটি সম্ভবত পথ পরিবর্তনের জন্য কিছু জাদু করতে পারে এবং আরও সহজ হবে।
0xC0000022L

@ STATUS_ACCESS_DENIED কীভাবে? একমাত্র স্ট্রিং অপারেশন হ'ল /mntএকটি পাথ পূর্ববর্তী করা ; আপনার মনগড়া ছাড়া আর কোনও ফ্যানসিয়ার স্ট্রিং অপারেশন দরকার নেই।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস: দুঃখিত, আমি আপেক্ষিক পথগুলি নিয়ে আপনার মন্তব্য সম্পর্কে আরও ভাবছিলাম। আপনার উদাহরণের সঠিক "অনুবাদ" এর জন্য আপনি অবশ্যই সঠিক।
0xC0000022L

13

আমি জানি এটি লেখক অনুরোধ করছেন ঠিক তেমন নয় তবে মনে হয় তাদের ইতিমধ্যে তাদের উত্তর রয়েছে তাই আমি আমার মতো অন্যদের জন্য এটি যুক্ত করছি যারা এই প্রশ্নটিতে হোঁচট খায়।

নিম্নলিখিতগুলিতে আরও সহায়তা করা উচিত যদি আরও নমনীয় সমাধানের প্রয়োজন হয় যেমন ভাঙা প্রতীকী লিঙ্কগুলির একটি গুচ্ছ থাকা যা প্রতীকী লিঙ্কের লক্ষ্যগুলির অংশের পরিবর্তে স্থির করা যায়।

যেমন। ব্যবহারকারীর নাম পরিবর্তনের পরে, পুরানো ব্যবহারকারীর নামটি নতুন লিঙ্কের সাথে নতুন লিঙ্কের পরিবর্তে অনেকগুলি লিঙ্কের টার্গেটে স্থানান্তরিত হওয়ার পরে। নীচে প্রদর্শিত প্রতিস্থাপন-সিমিলিংক নামে একটি স্ক্রিপ্ট তৈরি করুন:

#!/bin/bash
link=$1
# grab the target of the old link
target=$(readlink -- "$1")

# replace the first occurrence of oldusername with newusername in the target string
target=${target/oldusername/newusername}

# Test the link creation
echo ln -s -- "$target" "$link"

# If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again
#rm $link
#ln -s "$target" "$link"

এবং নিম্নলিখিত কমান্ড সহ এটি কল:

find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \;

আশা করি এটি কারও সাহায্য করবে

সম্পাদনা: এই স্ক্রিপ্টে কিকস্টার্ট এবং লিঙ্কগুলিকে আপেক্ষিক করতে সিমলিংক স্ক্রিপ্টটি ব্যবহার সম্পর্কে পরামর্শ দেওয়ার জন্য গিলসকে ধন্যবাদ জানাই।


1
আমি এই সমাধানটি আরও ভাল পাই কারণ এটি একটি স্ট্রিং প্রতিস্থাপন ব্যবহার করে, যা আপনাকে এমন পথে সাহায্য করে যেখানে আপনাকে পথের মাঝখানে কোনও ফোল্ডারের নাম পরিবর্তন করতে হবে। প্রয়োজনে আরও জটিল রূপান্তর সম্পাদন করতেও সমাধানটি বেশ সহজ quite
গ্যালাসিও

আমি স্ট্রিং প্রতিস্থাপনের সাথে যুক্তিগুলি উদ্ধৃত করার পরামর্শ দেব, যেমন ওপরের প্রশ্নের পথের জন্য স্ল্যাশ ব্যবহার করতে হবে। target=${target/"/home"/"/mnt/home"}যদিও খুব সহায়ক। ধন্যবাদ।
ওয়াল্টার নিসসেন

3

এতে /homeএকটি /mnt/homeসিমলিংক হিসাবে তৈরি করুন এবং সমস্ত বিদ্যমান সিমলিঙ্কগুলি আবার বৈধ হবে।


2
বাইন্ড-মাউন্টিং প্রায়শই সিনেমালিঙ্কগুলির তুলনায় কম ভঙ্গুর হয়ে থাকে যেখানে প্রোগ্রামগুলি সিমলিংক সম্পর্কে সচেতন হয় এবং সত্যের উপর নির্ভর করে ভিন্নভাবে কাজ করে ...
0xC0000022L
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.