ডিরেক্টরিতে নির্দেশিত একটি সিমলিংক তৈরি করতে আমি কোন আদর্শবানী আদেশটি ব্যবহার করতে পারি?


16

আমি শেল স্ক্রিপ্টে একটি কমান্ড রাখতে চাই যা ডিরেক্টরিতে একটি সিমিলিংক তৈরি করবে, তবে এই স্ক্রিপ্টটি বার বার চালানো যেতে পারে, সুতরাং পরবর্তী অনুরোধগুলিতে কমান্ডটি কোনও পরিবর্তন করা উচিত নয়।

এখানে ডিরেক্টরি কাঠামো:

% tree /tmp/test_symlink 
/tmp/test_symlink
├── foo
└── repo
    └── resources
        └── snippets
            ├── php.snippets
            ├── sh.snippets
            ├── snippets.snippets
            ├── sql.snippets
            └── vim.snippets

আমি foo/স্নিপেটস নামে একটি সিমিলিংক তৈরি করতে চাই যা ডিরেক্টরিটিতে নির্দেশ করে /tmp/test_symlink/repo/resources/snippets
সুতরাং আমি চালান:

% ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets
'/tmp/test_symlink/foo/snippets' -> '/tmp/test_symlink/repo/resources/snippets'

যা পছন্দসই ফলাফল দেয়।

% tree /tmp/test_symlink                                                          
/tmp/test_symlink
├── foo
   └── snippets -> /tmp/test_symlink/repo/resources/snippets
└── repo
    └── resources
        └── snippets
            ├── php.snippets
            ├── sh.snippets
            ├── snippets.snippets
            ├── sql.snippets
            └── vim.snippets

5 ডিরেক্টরি, 5 ফাইল

তবে, যখন কমান্ডটি আবার চালানো হবে,

% ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets
'/tmp/test_symlink/foo/snippets/snippets' -> '/tmp/test_symlink/repo/resources/snippets'

এটি একটি ডিরেক্টরিতে একটি সিলিমিংক তৈরি করে, যেখানে সিমলিংক এলিয়াডি উপস্থিত থাকে যা প্রকৃত ডিরেক্টরিতে সিমলিংক রাখে

% tree /tmp/test_symlink                                                          
/tmp/test_symlink
├── foo
   └── snippets -> /tmp/test_symlink/repo/resources/snippets
└── repo
    └── resources
        └── snippets
            ├── php.snippets
            ├── sh.snippets
            ├── snippets -> /tmp/test_symlink/repo/resources/snippets
            ├── snippets.snippets
            ├── sql.snippets
            └── vim.snippets

কেন এটি হচ্ছে এবং আমি কীভাবে আদেশটি সংশোধন করতে পারি যাতে পরবর্তী অনুরোধগুলি এই অদ্ভুত প্রভাব তৈরি করতে না পারে?

উত্তর:


16

-Tএটির জন্য আপনার বিকল্পটি ব্যবহার করা উচিত , এটি lnলিঙ্কের নামটিকে সর্বদা পছন্দসই লিঙ্কের নাম হিসাবে বিবেচনা করতে বলে , ডিরেক্টরি হিসাবে কখনও নয়।

এই বিকল্পটি ব্যতীত, আপনি যদি lnকোনও লিঙ্কের নাম দেন যা ডিরেক্টরি হিসাবে বিদ্যমান, এটি ডিরেক্টরিটির ভিতরে লক্ষ্যটিতে একটি নতুন লিঙ্ক তৈরি করে।

মনে রাখবেন যে -Tএটি একটি জিএনইউ-ইসম (অন্ততপক্ষে, এটি পসিক্সে নেই) তবে আপনি ইতিমধ্যে ব্যবহার করছেন -vযা কোন জিএনইউ-ইসম খুব বেশি তাই আমি ভাবছি এটি কোনও সমস্যা নয়।

বিকল্পভাবে, আপনি কেবল লিঙ্কের নাম হিসাবে পিতামহিত ডিরেক্টরিটি নির্দিষ্ট করতে পারেন এবং লিঙ্কটি সর্বদা সেখানে তৈরি হবে (পুনরায়):

ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/

এটি কাজ করে কারণ আপনার সিমলিংকের লক্ষ্য হিসাবে একই নাম রয়েছে।


ধন্যবাদ, হ্যাঁ gnu অপশনগুলি অগত্যা পোর্টেবল নয়, তবে এগুলি সত্যই কার্যকর হতে পারে - যখন বহনযোগ্যতা প্রয়োজন হয় না। আপনার উত্তর আমার জন্য কাজ করে। ম্যান পেজ থেকে -n, --no-dereference treat LINK_NAME as a normal file if it is a symbolic link to a directory-T, --no-target-directory treat LINK_NAME as a normal file alwaysআপনি কি মনে করেন যে সর্বদা একটি সিমলিংকটিকে ফাইল হিসাবে বিবেচনা করা ভাল? আমি ভাবতাম কি এই "বিশেষ" বিকল্পগুলির ব্যবহার সীমাবদ্ধ করা ভাল?
the_velour_fog 7

যদি আপনি জানেন যে সেগুলি উপলব্ধ, তবে জিএনইউ-নির্দিষ্ট বিকল্পগুলি (আইএমও) এড়ানোর কোনও কারণ নেই। আপনি একজন আদর্শবান কমান্ড চেয়েছিলেন, -Tআপনি কীভাবে lnআদর্শবানকে তৈরি করেন। আপনি যদি পছন্দ করেন তবে একই ফল পাওয়ার অন্যান্য উপায় রয়েছে যেমন লিংকটি মুছে ফেলা এবং এটি পুনরায় তৈরি করা বা আপনি যদি fooইতিমধ্যে জানেন তবে ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/(আসলে এটি সম্পূর্ণরূপে আরও ভাল উত্তর হতে পারে, আমি আপডেট করব)।
স্টিফেন কিট

1
শীতল, হ্যাঁ আমি পূর্বে ifসিমলিংকের উপস্থিতি সনাক্ত করার জন্য বিবৃতি ব্যবহার করেছিলাম এবং সিমলিংকের উপস্থিতি থাকলে কমান্ডটি এড়িয়ে যায়, তবে স্ক্রিপ্টগুলি বিশৃঙ্খলাযুক্ত এবং পড়ার পক্ষে কঠিন হয়ে যায়, আমি mkdir -pকোনও পরীক্ষার ব্যবহার না করার মতো আদর্শ, আদর্শ কিন্তু সহজ কিছু যাচ্ছিলাম was , কোনও যুক্তি নেই, কেবল ভাল ওল ওয়ান ওয়ান লাইনার :)
The_velour_fog

@ স্টিফেন কিট: আপনি টি-টি ব্যবহারের কথা উল্লেখ করেছেন, কিন্তু আমি আপনার উত্তরের কোড স্নিপেটে এটি খুঁজে পাইনি। আমি কি ভুল বোঝাবুঝি করছি বা কিছু মিস করছি?
Guizmoo03

@ গুইজমো03 সম্ভবত আপনি "বিকল্পভাবে" মিস করেছেন যা স্নিপেটটি প্রবর্তন করে। প্রথম তিনটি অনুচ্ছেদে ব্যাখ্যা করা হয়েছে -T, তবে আমার উত্তরের শেষে একটি অন্য সমাধান উপস্থাপন করেছে যা ব্যবহার করে না -T
স্টিফেন কিট

-1

সর্বোত্তম আমি এখানে যা ঘটছে তা বলতে পারি যে দ্বিতীয় পাসে lnকমান্ডটি এর মত আচরণ করে cpবা mvযা হ'ল <ডিস্ট্রিপশন> এ এটি যদি কোনও "ডিরেক্টরি" দেখায় তবে এটি ফাইলটিকে তার ভিতরে রাখবে, অন্যথায় <ডিস্টেটিশন> না করলে বিদ্যমান, এটি <বিস্তৃতি> তৈরি করবে। (যা "স্ল্যাশডট" কৌশল এড়িয়ে চলে - যেমন এটি নিশ্চিত করবে যে <বিস্তৃতি> বিদ্যমান এবং এটি ডিরেক্টরি)।
তবে আমি ভুল হতে পারি।

উভয় ক্ষেত্রেই এটি কাজ করে বলে মনে হচ্ছে

ln -sfv --no-dereference /tmp/test_symlink/repo/resources/snippets/ foo/snippets
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.