একটি ফোল্ডারের মধ্যে সমস্ত হার্ডলিঙ্কগুলি ভাঙ্গুন


10

আমার একটি ফোল্ডার রয়েছে যার মধ্যে একটি নির্দিষ্ট সংখ্যক ফাইল রয়েছে যার মধ্যে হার্ড লিঙ্ক রয়েছে (একই ফোল্ডারে বা অন্য কোথাও), এবং আমি এই ফাইলগুলি ডি-হার্ডলিঙ্ক করতে চাই, তাই তারা স্বতন্ত্র হয়ে যায় এবং তাদের সামগ্রীতে পরিবর্তনগুলি কোনও প্রভাব ফেলবে না অন্যান্য ফাইল (তাদের লিঙ্ক গণনা 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ফাইল) ওভাররাইড করা উচিত , যদিও টেম্পফাইলে স্বতন্ত্র ফাইলের নাম দেওয়া উচিত , সুতরাং অবশ্যই সেখানে থাকতে হবে একরকম বর্ণের অবস্থা বা যাই হোক না কেন, এবং এর সাথে কিছু ডেটা আলগা হওয়ার ঝুঁকি রয়েছে।
সুজান ডুপোরন

1
ফাইলটি উপস্থিত রয়েছে এটাই স্বাভাবিক, আপনি এটিকে কেবল টেম্পাইল দিয়ে তৈরি করেছেন (এনবি: এমকেটেম্পের পক্ষে অবমূল্যায়ন করেছেন, তবে এটি আপনার সমস্যার কারণ নয়)।
তোবু

1
আপনার unhardlink.shএকই ডিরেক্টরিতে অস্থায়ী ডিরেক্টরি তৈরি করা উচিত যাতে ফাইলটি আনড্রিং লিঙ্ক করা দরকার contains অন্যথায় আপনার পুনরাবৃত্ত কলটি অন্য একটি ফাইল সিস্টেমের ভিতরে পুনরাবৃত্তি হতে পারে এবং আপনি ফাইল সিস্টেমের সীমানা পেরিয়ে স্টাফগুলি সরিয়ে ফেলেন কারণ আপনার অস্থায়ী ডিরেক্টরি বর্তমান কার্যনির্বাহী ডিরেক্টরিতে রয়েছে। আমার ধারণা আপনি "$(dirname "$i")/hardlink-XXXXXX"পরিবর্তে এমকেটেম্পের পক্ষে যুক্তি হিসাবে পাস করতে পারেন ।
মিক্কো রেন্টালাইনেন

1
@ মিকো রেন্টালাইনেন অনেক ধন্যবাদ, আপডেট হয়েছে! নোট করুন যে ফাইল সিস্টেমটি যদি একরকম ইউনিয়ন বা কোনও fuseফাইল সিস্টেম হয় তবে এটি প্রকৃতপক্ষে path/to/hardlink-XXXকোনও ভিন্ন শারীরিক স্টোরেজ মিডিয়ামে প্রেরণ path/to/original-fileকরতে পারে তবে এটি সম্পর্কে খুব বেশি কিছু করা যায় না।
সুজান ডুপোরন

উত্তর:


9

আপনার স্ক্রিপ্টে উন্নতির জন্য জায়গা রয়েছে, উদাহরণস্বরূপ কমান্ডটিতে একটি -pবিকল্প যুক্ত করা cpযাতে অনুমতিগুলি এবং টাইমস্ট্যাম্পগুলি আনার্ল্ড লিঙ্ক অপারেশন জুড়ে সংরক্ষণ করা যায় এবং আপনি কিছু ত্রুটি পরিচালনা করতে পারেন যাতে কোনও ত্রুটির ক্ষেত্রে টেম্প ফাইলটি মুছে ফেলা হয়, তবে আপনার সমাধানের প্রাথমিক ধারণাটি কেবলমাত্র কাজ করবে। কোনও ফাইলকে আনর্ডলিঙ্ক করতে আপনাকে এটিকে অনুলিপি করতে হবে এবং তারপরে অনুলিপিটি মূল নামের উপরে সরিয়ে ফেলতে হবে। কোনও "কম অপরিশোধিত" সমাধান নেই, এবং একই সমাধানে অন্য কোনও প্রক্রিয়া যদি ফাইল অ্যাক্সেস করে তবে এই দ্রষ্টব্যটিতে বর্ণের শর্ত রয়েছে।


প্রকৃতপক্ষে, আমি সবসময় সিপি -a ব্যবহার করি জিনিসগুলি অনুলিপি করার সময়, সমস্ত কিছু সংরক্ষণ করার জন্য, পুনরাবৃত্তি করা এবং প্রতিলিপি হিসাবে সিমলিঙ্কগুলি অনুলিপি করা। এবার কেন আমি এটি ভুলে গেছি জানি না, তবে আপনার উত্তরটি দেখে, আমি বুঝতে পেরেছিলাম যে আমি আমার সমস্ত টাইমস্ট্যাম্পগুলি ছড়িয়ে দিয়েছি এবং ব্যাকআপ থেকে সেগুলি (বরং বেদনাদায়ক) পুনরুদ্ধার করতে হয়েছিল।
সুজান ডুপোরন

5

আপনি যদি ডিস্কের স্থানটি জ্বালিয়ে রাখতে চান এবং আপনার তুলনামূলকভাবে আধুনিক সংস্করণ রয়েছে tar(যেমন, উবুন্টু 10.04 এবং সেন্টস 6 এ কী রয়েছে), আপনি --hard-dereferenceবিকল্পটি খেলতে পারেন ।

কিছুটা এইরকম:

$ cd /path/to/directory
$ ls -l *
bar:
total 12
-rw-rw-r-- 2 cjc cjc 2 May  6 19:07 1
-rw-rw-r-- 2 cjc cjc 2 May  6 19:07 2
-rw-rw-r-- 1 cjc cjc 2 May  6 19:07 3

foo:
total 12
-rw-rw-r-- 2 cjc cjc 3 May  6 19:07 1
-rw-rw-r-- 2 cjc cjc 2 May  6 19:07 2
-rw-rw-r-- 1 cjc cjc 2 May  6 19:07 4

(যেখানে আমি দৌড়েছি ln foo/[12] bar)

$ tar cvf /tmp/dereferencing.tar --hard-dereference .
$ tar xvf /tmp/dereferencing.tar
$ ls -l *
bar:
total 12
-rw-rw-r-- 1 cjc cjc 2 May  6 19:07 1
-rw-rw-r-- 1 cjc cjc 2 May  6 19:07 2
-rw-rw-r-- 1 cjc cjc 2 May  6 19:07 3

foo:
total 12
-rw-rw-r-- 1 cjc cjc 3 May  6 19:07 1
-rw-rw-r-- 1 cjc cjc 2 May  6 19:07 2
-rw-rw-r-- 1 cjc cjc 2 May  6 19:07 4

ম্যান পৃষ্ঠা থেকে:

   --hard-dereference
          follow hard links; archive and dump the files they refer to

আমি সন্দেহ করি যে এখানে খুব কম কিছু করতে পারে না। চমৎকার ফিক্স।
জোসেফ কার্ন

আমি উল্লেখ করতে ভুলে গেছি যে আমার কাছে সমস্ত কিছু অনুলিপি করার জন্য পর্যাপ্ত ডিস্কের জায়গা নেই। মূলত, আপনার পদ্ধতিটি একই রকম cp -a --no-preserve=links /path/to/folder /path/to/copy && rm -rf /path/to/folder && mv /path/to/copy /path/to/folder, যদি আমি ভুল না করি। আমি অনুমান করি যে আপনার পদ্ধতিটি আরও কার্যকর হবে, যদিও, টার কম ডিস্ক সিক্সের সাথে জড়িত থাকবে, তাই কম থ্র্যাশিং। সিপি পদ্ধতির তুলনায় এমনকি কম পারফরম্যান্সের সাথে আরএসসিএনসি দিয়ে কেউ এটি অর্জন করতে পারে।
সুজান ডুপোরন

1
অতিরিক্ত অতিরিক্ত ডিস্ক ব্যবহার এড়াতে, এমন কিছু চালানো সম্ভব হতে পারে tar cvf - --hard-dereference . | tar xf -তবে এমন একটি দৌড়ের শর্ত থাকতে পারে যা জিনিসগুলি বিস্ফোরণ ঘটায়। আমি এটি চেষ্টা করে দেখিনি, এবং আমি এই মুহুর্তে এটি করার জন্য একধরনের স্বচ্ছন্দ।
সিজেসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.