বর্তমান ডিরেক্টরি পরিবর্তন না করে সাব-ডাইরেক্টরিগুলিতে ফাইলগুলি সিমলিংক al


11

মনে হচ্ছে সাবডাইরেক্টরিগুলিতে সরানো ছাড়াই কোনও ফাইলকে নতুন ফাইলের সাথে একটি নতুন সিলেক করা সহজ হওয়া উচিত .... তবে সিনট্যাক্স সম্পর্কে কিছু বিভ্রান্ত করছে এবং আমি যা প্রত্যাশা করব তার বিপরীতে। এখানে একটি পরীক্ষার কেস রয়েছে:

mkdir temp
cd temp
mkdir deploy
echo "Contents of the build file!" > deploy/resources.build.php
ln -s deploy/resources.build.php deploy/resources.php
cat deploy/resources.php #bad symlink

এটি কেবল একটি ভাঙ্গা সিমিলিংক তৈরি করে! আমি এটি একটি বিল্ড এনভায়রনমেন্ট সেটআপ স্ক্রিপ্টে চালাচ্ছি, তাই আমি যদি সম্ভব হয় তবে বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করা এড়াতে চাই।

ln -s deploy/resources.build.php resources.php
cat deploy/resources.php

এছাড়াও কাজ করে না কারণ এটি মোতায়েনের উপ-ডিরেক্টরি পরিবর্তে অস্থায়ী ডিরেক্টরিতে সিমলিংক তৈরি করে।

cd deploy
ln -s resources.build.php resources.php
cd ..

এটি কাজ করে, তবে আমি ডিরেক্টরিগুলি পরিবর্তন না করে কীভাবে এটি করব তা জানতে পছন্দ করব।

সম্পূর্ণ পথ ব্যবহার করা যেমন:

/home/whatever/src/project/temp/stuff/temp/deploy/resources.build.php

কাজ করে তবে অযৌক্তিক এবং কিছুটা অযৌক্তিক হয়, বিশেষত এমন একটি বিল্ড এনভায়রনমেন্টে যেখানে সমস্ত প্রকল্পের জিনিসগুলি বিল্ড এবং এর মতো হতে পারে।

সাব-ডিরেক্টরীতে এবং সেটির বাইরে না গিয়ে, এবং নতুন ফাইলটি "ওরফে" একটি নতুন নাম দেওয়ার সময় আমি কীভাবে একটি উপ-ডিরেক্টরিতে দুটি ফাইলের মধ্যে একটি সিমিলিংক তৈরি করতে পারি?

উত্তর:


10

তবে সিনট্যাক্স সম্পর্কে কিছু বিভ্রান্ত করছে এবং আমি যা প্রত্যাশা করব তার বিপরীতে।

lnআপনি যে ফর্মটি এটি ব্যবহার করছেন সেটির পক্ষে যুক্তিগুলি হ'ল :

ln [বিকল্প] ... [-T] টার্গেট লিঙ্ক_NAME (1 ম ফর্ম)

বিভ্রান্তিকর, উদ্বেগহীন জিনিসটি হ'ল আপনি যখন একটি সিমিলিংক তৈরি করছেন তখন টার্গেট যুক্তিটি lnকোনও ফাইলের পথ হিসাবে প্রত্যাশিত নয়, বরং সিমলিংকের সামগ্রী তৈরি হবে। আপনি যদি এক মুহুর্তের জন্য এটি সম্পর্কে চিন্তা করেন তবে এটি স্পষ্টতই এটি হওয়া উচিত be বিবেচনা:

$ echo foo >foo
$ ln -s foo bar1
$ ln -s $PWD/foo bar2
$ cat bar1
foo
$ cat bar2
foo
$ ls -l bar1 bar2
lrwxrwxrwx 1 matt matt  3 Dec 29 16:29 bar1 -> foo
lrwxrwxrwx 1 matt matt 29 Dec 29 16:29 bar2 -> /home/matt/testdir/foo

সেই উদাহরণে আমি "বার 1" এবং "বার 2" নামে 2 টি সিমলিংক তৈরি করি যা একই ফাইলটিতে নির্দেশ করে। lsদেখায় যে প্রতিলিঙ্কগুলির নিজস্ব বিভিন্ন বিষয়বস্তু রয়েছে যদিও - একটিতে একটি পরম পাথ থাকে এবং একটিতে একটি আপেক্ষিক পথ থাকে। এ কারণে, এটি অন্য ডিরেক্টরিতে স্থানান্তরিত করা সত্ত্বেও একজন কাজ করা চালিয়ে যাবে এবং অন্যটি তা করবে না:

$ mv bar2 /tmp
$ cat /tmp/bar2
foo
$ mv bar1 /tmp
$ cat /tmp/bar1
cat: /tmp/bar1: No such file or directory

সুতরাং, আমরা অবশ্যই আপেক্ষিক এবং পরম উভয় symlinks তৈরি করতে সক্ষম হব এবং এমনকি লক্ষ্যযুক্ত ফাইলটি তৈরি করা হলে ভাঙা symlinks যা অ-ভাঙা হয়ে উঠবে তা তৈরি করতে, লক্ষ্য যুক্তিটি ফ্রিফর্ম পাঠ্য হিসাবে ব্যাখ্যা করতে হবে, বরং ইতিমধ্যে বিদ্যমান ফাইলের পথ।

আপনি যদি ডিপ্লোয় / রিসোর্স.ফিল্প নামের একটি ফাইল তৈরি করতে চান যা ডিপোয়েল / রিসোর্স.বিল্ড.পিএপি-র সাথে লিঙ্ক করে, আপনি সিদ্ধান্ত নিতে হবে যে আপনি একটি পরম সিমলিংক তৈরি করতে চান (যা সিমলিংকের স্থানান্তরিত হওয়ার বিরুদ্ধে স্থিতিস্থাপক, তবে ব্রেক হলে) লক্ষ্য স্থানান্তরিত হয়), বা একটি আপেক্ষিক সিমলিংক (যা সিমলিংক এবং লক্ষ্য উভয়কে একসাথে সরানো হয় এবং একই আপেক্ষিক পাথ বজায় রাখার সময় পর্যন্ত কাজ করে যাবে)।

একটি পরম syMLink তৈরি করতে, আপনি এটি করতে পারেন:

$ ln -s $PWD/deploy/resources.build.php deploy/resources.php

কোনও আপেক্ষিক তৈরি করতে, আপনি প্রথমে উত্স থেকে লক্ষ্য পর্যন্ত আপেক্ষিক পথটি বের করবেন। এই ক্ষেত্রে, যেহেতু উত্স এবং লক্ষ্য একে অপরের সাথে সম্পর্কিত একই ডিরেক্টরিতে রয়েছে, আপনি কেবল এটি করতে পারেন:

$ ln -s resources.build.php deploy/resources.php

যদি সেগুলি একই ডিরেক্টরিতে না থাকে তবে এর পরিবর্তে আপনাকে এমন কিছু করতে হবে:

$ ln -s ../foo/f bar/b

সেক্ষেত্রে fooএবং যদিও barআপনার বর্তমান ডিরেক্টরিতে এটি উভয়ই, আপনাকে লক্ষ্যবস্তুতে একটি অন্তর্ভুক্ত করতে হবে কারণ এতে ডিরেক্টরিটি অন্তর্ভুক্ত থাকা ডিরেক্টরি থেকে কীভাবে সন্ধান করা যায় তা বর্ণনা করে ।../ln fb

এটি অত্যন্ত দীর্ঘ ব্যাখ্যা, তবে আশা করি এটি আপনাকে lnসিনট্যাক্সটি আরও ভালভাবে বুঝতে সহায়তা করবে ।


3

আপনি নীচে একটি সাব-শেলের লিঙ্কটি তৈরি করতে পারেন:

  (cd deploy && ln -s resources.build.php resources.php && cat resources.php)

সাবশেলটি কার্যকর হলে শেষ হবে, আপনি নিজেকে সঠিক ডিরেক্টরিতে এখনও খুঁজে পাবেন।

বিকল্পভাবে, আপনি চেষ্টা করতে পারেন

 ln -s resources.build.php deploy/resources.php

এটি কাজ করে, সিএল-তে অন্তর্ভুক্ত করে উপস্থাপন করে যে ফাইল উত্স . build.php আপনি যে ডিরেক্টরিটি কমান্ডটি দিচ্ছেন সেখানে নেই, তবে প্রকৃতপক্ষে ./deploy এর মধ্যে রয়েছে


এই তো কালো যাদু, স্যার!
কেজকাই

1

একটি সিমিলিংক মূলত একটি কনফিগার ফাইল না হওয়া পর্যন্ত এটি আমাকে বিভ্রান্ত করেছে। উদাহরণস্বরূপ, আমি কীভাবে একটি সাধারণ পাঠ্য ফাইলে সেই পথের ডেটা লিখব:

ln -s [target] [link name]

হয়ে:

echo [target] > [link name]

ত্রুটি যে আমি (এবং সম্ভবত ওপি) তৈরি ছিল চিন্তা হয় Ln চাহিদা ফাইল এটা লক্ষ্য করে করা হয় সম্পর্কে জানা। LN কেয়ার করে না। এটি কেবল একটি ফাইলের মধ্যে কিছু পথের তথ্য লিখছে। এটি একটি সম্পূর্ণ যুক্তিসঙ্গত ln কমান্ড:

ln -s /path/doesnt/exist/file.err
ll
file.err -> /path/doesnt/exist/file.err

অত: পর:

ln -s deploy/resources.build.php deploy/resources.php

একটি simlink নামক ফাইল উৎপন্ন resources.phpমধ্যে ./deployফোল্ডারে ফাইল উল্লেখ করছে resources.build.phpফোল্ডারে ./deploy/deploy/

এটি যা আপনি চান তা অসম্ভব এবং একটি খারাপ (ভাঙা) লিঙ্ক দেয়। লিঙ্কটিতে কোনও ভুল নেই, আপনি যদি সেই ফাইলটি সেখানে রাখেন তবে লিঙ্কটি কাজ করে। যাইহোক, (অন্যদের দ্বারা চিহ্নিত হিসাবে) আমি এবং ওপি যা চেয়েছিলাম তা হ'ল:

ln -s resources.build.php deploy/resources.php
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.