ব্যস্তবক্সে কোনও ডিরেক্টরিতে কীভাবে পরমাণুভাবে কোনও সিমলিংক পরিবর্তন করে?


18

আমি চেষ্টা করছি (যতটা সম্ভব কাছাকাছি) পারমাণবিকভাবে একটি সিমিলিংক পরিবর্তন করতে। আমি চেষ্টা করেছিলাম:

ln -sf other_dir existing_symlink

এটি কেবলমাত্র নতুন সিমলিংকে সেই ডিরেক্টরিটিতে রেখে দিয়েছে যা বিদ্যমান_সিসমিলিং নির্দেশ করে।

ln -sf other_dir new_symlink
mv -f new_symlink existing_symlink

এটি একই কাজ করেছিল: এটি সিমলিংকে ডিরেক্টরিতে স্থানান্তরিত করে।

cp -s other_dir existing_symlink

এটি অস্বীকার করে কারণ এটি একটি ডিরেক্টরি।

আমি পড়েছি যা mv -Tএই জন্য তৈরি করা হয়েছিল, তবে ব্যস্তবক্সে -Tপতাকা নেই।

উত্তর:


1

আপনি কীভাবে পারমাণবিক অপারেশন করতে পারবেন তা আমি দেখতে পাচ্ছি না। এর জন্য ম্যান পেজটি symlink(2)বলেছে EEXISTযে লক্ষ্যটি ইতিমধ্যে বিদ্যমান থাকলে এটি দেয় । কার্নেল যদি পারমাণবিক ক্রিয়াকলাপ সমর্থন করে না, তবে আপনার ব্যবহারকারীর দেশের সীমাবদ্ধতা অপ্রাসঙ্গিক।

আপনার কাছে mv -Tথাকলেও কীভাবে সহায়তা করে তা আমি দেখতে পাই না। এটি একটি নিয়মিত লিনাক্স বাক্সে ব্যবহার করে দেখুন, এটি একটি জিএনইউ এমভি সহ:

$ mkdir a b
$ ln -s a z
$ mv -T b z
mv: cannot overwrite non-directory `z' with directory `b'

আমার মনে হয় আপনাকে দুটি পদক্ষেপে এটি করতে হবে: পুরানো সিমিলিংকটি সরিয়ে এটি আবার তৈরি করুন।


1
প্রকৃতপক্ষে, দুর্ভাগ্যক্রমে কোনওভাবেই আপনি প্রতীককে পারমাণবিকভাবে সংশোধন করতে পারবেন না। পুরানো লিঙ্কটি সরিয়ে নতুন একটি তৈরি করা আপনি সবচেয়ে ভাল যা করতে পারেন। জিএনইউ কোর্টিলসগুলির একটি একক কমান্ড ( ln -snf) দিয়ে এটি করার একটি বিকল্প রয়েছে তবে হুডের নীচে এখনও দুটি সিস্টেম কল রয়েছে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

43

এই করতে প্রকৃতপক্ষে সঙ্গে atomically সম্পন্ন করা rename(2), প্রথম একটি অস্থায়ী নামে নতুন সিমবলিক লিঙ্ক তৈরি এবং তারপর পরিচ্ছন্নভাবে এক বারেই পুরাতন সিমবলিক লিঙ্ক মুছে যাওয়ার দ্বারা। হিসাবে man পৃষ্ঠা পদ বলে:

নতুনপথ যদি প্রতীকী লিঙ্ককে বোঝায় তবে লিঙ্কটি ওভাররাইট করা হবে।

শেলটিতে আপনি নীচের সাথে এটি করবেন mv -T:

$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z

straceএটি যে সত্যই rename(2)হুডের নীচে ব্যবহার করছে তা নিশ্চিত করার জন্য আপনি শেষ কমান্ডটি করতে পারেন :

$ strace mv -T z.new z
lstat64("z.new", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat64("z", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("z.new", "z")                    = 0

নোট করুন যে উপরেরটিতে mv -Tএবং উভয়ই straceলিনাক্স-নির্দিষ্ট।

ফ্রিবিএসডি-তে, mv -hপর্যায়ক্রমে ব্যবহার করুন ।


1
খুব সুন্দর! এটি বলতে আপনার পক্ষে সহায়ক হতে পারে যে শেষে আপনার কাছে z থেকে b এর লিঙ্ক রয়েছে!
ভিনসেঞ্জো পাইই

কোনও ওএস-স্বতন্ত্র সমাধানের জন্য একটি স্ক্রিপ্টিং ভাষা ব্যবহার করুন যা renameসরাসরি mv -hবা এর পরিবর্তে সিস্কলটি সরাসরি ব্যবহার করতে সক্ষম mv -T। পার্লের সাথে উদাহরণস্বরূপ:perl -e 'rename "z.new", "z" or die $!'
স্লেভেন রেজিক

8

আর্টো যেখান থেকে চলে গিয়েছিল তা তুলে নেওয়া, এটি সম্পূর্ণরূপে সম্ভব, এমনকি ছাড়াই mv -T, আপনাকে কেবল লক্ষ্য ডিরেক্টরি হিসাবে একই নামের সাথে একটি নতুন সিমলিংক তৈরি করতে mvহবে এবং এটি আপনার টার্গেটের মূল ডিরেক্টরিতে অন্তর্ভুক্ত করা উচিত:

mkdir -p tmp/real_dir1 tmp/real_dir2
touch tmp/real_dir1/a tmp/real_dir2/a
# start with ./target_dir pointing to tmp/real_dir1
ln -s tmp/real_dir1 target_dir
# create a symlink named target_dir in tmp, pointing to real_dir2
ln -sf tmp/real_dir2 tmp/target_dir
# atomically mv it into ./ replacing ./target_dir
mv tmp/target_dir ./

কোড উদাহরণ ( http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/ ) এর মাধ্যমে গৃহীত


3

আপনি চেষ্টা করেছেন ln -snf?

-nগন্তব্য কোনও ডিরেক্টরিতে প্রতীকী লিঙ্ক হয়ে গেলে বিকল্পটি এর অধীনে লেখার পরিবর্তে গন্তব্যটিকে ওভাররাইট করে।

চিয়ার্স


3
ln -snfপারমাণবিক নয়: এটি গন্তব্যটিকে লিঙ্কযুক্ত করে, তারপরে কাঙ্ক্ষিত সিমলিংক তৈরি করে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

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