আমার একটি ফোল্ডার রয়েছে যার মধ্যে একটি নির্দিষ্ট সংখ্যক ফাইল রয়েছে যার মধ্যে হার্ড লিঙ্ক রয়েছে (একই ফোল্ডারে বা অন্য কোথাও), এবং আমি এই ফাইলগুলি ডি-হার্ডলিঙ্ক করতে চাই, তাই তারা স্বতন্ত্র হয়ে যায় এবং তাদের সামগ্রীতে পরিবর্তনগুলি কোনও প্রভাব ফেলবে না অন্যান্য ফাইল (তাদের লিঙ্ক গণনা 1 হয়ে যায়)।
নীচে, আমি একটি সমাধান দিচ্ছি যা মূলত প্রতিটি হার্ড লিঙ্কটিকে অন্য কোনও স্থানে অনুলিপি করে তারপরে এটি আবার জায়গায় সরিয়ে দেয়।
তবে এই পদ্ধতিটি বরং অপরিশোধিত এবং ত্রুটিযুক্ত বলে মনে হচ্ছে, তাই আমি জানতে চাই যে এমন কোনও কমান্ড রয়েছে যা আমার জন্য একটি ফাইলকে ডি-হার্ডলিঙ্ক করবে।
অশোধিত উত্তর:
হার্ড লিঙ্ক রয়েছে এমন ফাইলগুলি সন্ধান করুন ( সম্পাদনা করুন : সকেট ইত্যাদির জন্যও যা হার্ডলিঙ্ক রয়েছে, ব্যবহার করুন find -not -type d -links +1
):
find -type f -links +1 # files only
find -not -type d -links +1 # files, sockets etc.
কোনও ফাইলকে ডি-হার্ডলিঙ্ক করার একটি অশোধিত পদ্ধতি (এটি অন্য কোনও স্থানে অনুলিপি করুন এবং এটিকে আবার সরিয়ে ফেলুন): সম্পাদনা: যেমন সেলদা বলেছিলেন, টাইমস্ট্যাম্প এবং অনুমতিগুলি না হারিয়ে এড়াতে নীচের সিপি -পি করা
ভাল। সম্পাদনা করুন: একটি অস্থায়ী ডিরেক্টরি তৈরি mv
করুন এবং এটির অধীনে একটি ফাইলটিতে অনুলিপি করুন, কোনও টেম্প ফাইলকে ওভাররাইট করার পরিবর্তে, কিছু তথ্য ওভাররাইট করার ঝুঁকিটি হ্রাস করে, যদিও কমান্ডটি এখনও ঝুঁকিপূর্ণ (ধন্যবাদ @ টোবু)। সম্পাদনা করুন: একই ফাইল সিস্টেমে অস্থায়ী ডিরেক্টরি তৈরি করার চেষ্টা করুন (@ মিকো রেন্টালাইনেন)।
# This is unhardlink.sh
set -e
for i in "$@"; do
temp="$(mktemp -d -- "${i%/*}/hardlnk-XXXXXXXX")"
[ -e "$temp" ] && cp -ip "$i" "$temp/tempcopy" && mv "$temp/tempcopy" "$i" && rmdir "$temp"
done
সুতরাং, এর আন-hardlink সব কঠিন লিঙ্ক ( সম্পাদনা : পরিবর্তিত -type f
করতে -not -type d
, উপরে দেখুন):
find -not -type d -links +1 -print0 | xargs -0 unhardlink.sh
cp -i
স্যুইচটি ব্যবহার করে চালিত করেছি , এটি আমার কাছে কিছু বার্তা স্পট করেছে যাতে এটি জিজ্ঞেস করে যে এটি ./fileXXXXXX
( $temp
ফাইল) ওভাররাইড করা উচিত , যদিও টেম্পফাইলে স্বতন্ত্র ফাইলের নাম দেওয়া উচিত , সুতরাং অবশ্যই সেখানে থাকতে হবে একরকম বর্ণের অবস্থা বা যাই হোক না কেন, এবং এর সাথে কিছু ডেটা আলগা হওয়ার ঝুঁকি রয়েছে।
unhardlink.sh
একই ডিরেক্টরিতে অস্থায়ী ডিরেক্টরি তৈরি করা উচিত যাতে ফাইলটি আনড্রিং লিঙ্ক করা দরকার contains অন্যথায় আপনার পুনরাবৃত্ত কলটি অন্য একটি ফাইল সিস্টেমের ভিতরে পুনরাবৃত্তি হতে পারে এবং আপনি ফাইল সিস্টেমের সীমানা পেরিয়ে স্টাফগুলি সরিয়ে ফেলেন কারণ আপনার অস্থায়ী ডিরেক্টরি বর্তমান কার্যনির্বাহী ডিরেক্টরিতে রয়েছে। আমার ধারণা আপনি "$(dirname "$i")/hardlink-XXXXXX"
পরিবর্তে এমকেটেম্পের পক্ষে যুক্তি হিসাবে পাস করতে পারেন ।
fuse
ফাইল সিস্টেম হয় তবে এটি প্রকৃতপক্ষে path/to/hardlink-XXX
কোনও ভিন্ন শারীরিক স্টোরেজ মিডিয়ামে প্রেরণ path/to/original-file
করতে পারে তবে এটি সম্পর্কে খুব বেশি কিছু করা যায় না।