সিমলিংকে হার্ড লিঙ্কগুলিতে রূপান্তর করুন


25

আমি পুনরাবৃত্তভাবে একটি ডিরেক্টরিতে হার্ড লিঙ্কগুলিতে নরম লিঙ্কগুলিতে রূপান্তর করতে চাই। আমি এরকম কিছু চেষ্টা করেছি:

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done

… তবে এর দুটি বড় সমস্যা রয়েছে:

  • পুনরাবৃত্তি না
  • প্রতীকী লিঙ্ক নয় এমন ফাইলগুলি বাছাই করে

উপরের লাইনটি কোনওভাবে খাওয়ানো ভাল লাগবে find -type lতবে কীভাবে এটি করবেন তা সম্পর্কে আমি নিশ্চিত নই।


1
এছাড়াও [এই আলোচনা] [1] ( cp -aH) দেখুন। [১]: ইউনিক্স.স্ট্যাকেক্সেঞ্জার.কমিশনস
মাইকেল শিগোরিন

উত্তর:


34

এই আদেশটি কাজ করা উচিত:

find -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \;

কিভাবে এটা কাজ করে:

  • find -type l বর্তমান ডিরেক্টরিতে সমস্ত লিঙ্ক সন্ধান করে।

  • -exec bash -c '...' {} \;মৃত্যুদন্ড কার্যকর করার জন্য বাশকে আহ্বান জানায় ...

    এটি পাস হয় {}- বর্তমানে প্রক্রিয়াকৃত লিঙ্কটির নাম - একটি যুক্তি হিসাবে, যা বাশ এটিকে অ্যাক্সেস করতে পারে $0

  • readlink -m "$0" প্রতীকী লিঙ্কের গন্তব্যটির পরম পথ ফেরায়।

  • ln -f "$(readlink -m "$0")" "$0"ওভাররাইট ( -f) $0এর লক্ষ্যের একটি হার্ড লিঙ্ক সহ প্রতীকী লিঙ্ক ।

লিঙ্কটি যদি কোনও কারণে রূপান্তরিত না করা যায় তবে এটি অচ্ছুত থাকবে এবং ln একটি ত্রুটি বার্তা প্রিন্ট করবে।


যে শেষ অনুচ্ছেদ সম্বন্ধে এটি পরম পাথ উল্লেখ করার জন্য যথেষ্ট না bashএবং ln?
ড্যানিয়েল বেক

2
আমার সমস্যাটি হ'ল রিডলিঙ্কটি ডিফল্টরূপে কোনও আপেক্ষিক পাথ ফেরত দেয় তবে -eস্যুইচ এটি ঠিক করে।
ডেনিস

ওএসএক্সের জন্য কমান্ডটি কী হবে?
ইগোর মার্কেলোভ

@ ইগোরমার্কেলভ আমি দুঃখিত, তবে ওএসএক্সের ক্ষেত্রে আমার কোনও ধারণা নেই।
ডেনিস

1
একটি ম্যাক এ এটি: brew install coreutilsএবং find * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
ইগোর মার্কেলোভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.