প্রতিটি ফাইলের জন্য হার্ডলিঙ্কগুলি ব্যবহার করে কীভাবে ডিরেক্টরি অনুলিপি করতে হবে


52

আমি ডিরেক্টরি গাছের একটি "অনুলিপি" তৈরি করতে চাই যেখানে প্রতিটি ফাইলই মূল ফাইলটির হার্ডলিঙ্ক

উদাহরণ: আমার একটি ডিরেক্টরি কাঠামো রয়েছে:

dirA/
dirA/file1
dirA/x/
dirA/x/file2
dirA/y/
dirA/y/file3

এখানে প্রত্যাশিত ফলাফল, ডিরেক্টরি গাছের একটি "অনুলিপি" যেখানে প্রতিটি ফাইল মূল ফাইলের জন্য একটি হার্ডলিঙ্ক রয়েছে:

dirB/            #  normal directory
dirB/file1       #  hardlink to dirA/file1
dirB/x/          #  normal directory
dirB/x/file2     #  hardlink to dirA/x/file2
dirB/y/          #  normal directory
dirB/y/file3     #  hardlink to dirA/y/file3

উত্তর:


50

লিনাক্সে (GNU এবং সুনির্দিষ্টভাবে যেমন কার্নেলের মতো লিনাক্স রয়েছে এমন সিস্টেমে পাওয়া যায় এমনগুলি busyboxপ্রয়োগ cpকরে) এবং সাম্প্রতিক ফ্রিবিএসডি তে, এইভাবে:

cp -al dirA dirB

আরও বহনযোগ্য সমাধানের জন্য, স্টাফেন চেজেলাস দ্বারা প্যাক্স এবং সিপিও ব্যবহার করে উত্তর দেখুন


নোট করুন যে pax, ফ্রিবিএসডি-তে cp -aলাইকগুলি হার্ডলিঙ্ক করে না m
স্টাফেন চেজেলাস

সচেতন হন যে হার্ড লিঙ্কগুলি পৃথক ফাইল সিস্টেম মাউন্টগুলিতে কাজ করে না।
ডেভ

24

প্যাসিকলি, আপনি paxএই -lবিকল্পটি সহ রিড + রাইটিং মোডে ব্যবহার করবেন :

pax -rwlpe -s /A/B/ dirA .

( -pe(সব ফাইল সম্ভব বৈশিষ্ট্যাবলী এই ক্ষেত্রে শুধুমাত্র ডিরেক্টরি) যে অনুলিপি করা অপরিবর্তিত, গনুহ মত cp'র -aনা)।

এখন, যদিও মান , তবুও কমান্ড খুব পোর্টেবল হয় না ।

প্রথমত, অনেকগুলি জিএনইউ / লিনাক্স-ভিত্তিক সিস্টেম paxডিফল্টরূপে অন্তর্ভুক্ত করে না (যদিও এটি একটি অ-alচ্ছিক POSIX ইউটিলিটি)।

তারপরে, কয়েকটি বাস্তবায়ন সহ বেশ কয়েকটি বাগ এবং অ-কনফর্মেন্সগুলি সেই কোডটি নিয়ে বেশ কয়েকটি সমস্যা সৃষ্টি করে।

  • ত্রুটির কারণে, সোলারিস 10 pax(কমপক্ষে) এর -rwlসাথে সংমিশ্রণে ব্যবহার করার সময় কাজ করে না -s। কোনও কারণে, মনে হয় এটি মূল এবং অনুলিপি উভয় পথেই বিকল্প প্রয়োগ করে। সুতরাং উপরে, এটি link("dirB/file", "dirB/file")পরিবর্তে কিছু করার চেষ্টা করবে link("dirA/file", "dirB/file")
  • FreeBSD 'র উপর, paxধরনের ফাইলের জন্য hardlinks তৈরি করে না সিমবলিক লিঙ্ক (POSIX দ্বারা অনুমোদিত একটি আচরণ)। কেবল এটিই নয়, এটি প্রতিলিঙ্কগুলির লক্ষ্যগুলিতেও বিকল্প প্রয়োগ করে (পসিক্স দ্বারা অনুমোদিত নয় এমন আচরণ )। সুতরাং উদাহরণস্বরূপ একটা যদি জন্য foo -> AAএ সিমবলিক লিঙ্ক dirA, এটা হয়ে যাবে foo -> BAdirB

এছাড়াও, আপনি যদি একই কাজ করতে চান তবে স্বেচ্ছাসেবী ফাইল পাথের সাথে যার বিষয়বস্তু সঞ্চিত আছে $srcএবং $dst, এটি উপলব্ধি করা গুরুত্বপূর্ণ যে এটির ভিতরে pax -rwl -- "$src" "$dst"সম্পূর্ণ ডিরেক্টরি কাঠামো তৈরি করে (এটি বিদ্যমান এবং একটি ডিরেক্টরি হতে হবে)। উদাহরণস্বরূপ, যদি হয় তবে তৈরি হয়।$src$dst$srcfoo/bar$dst/foo/bar

পরিবর্তে, আপনি এর $dstঅনুলিপি হতে চান $src, সম্ভবত সবচেয়ে সহজ এটি হিসাবে এটি করা:

absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && pax -rwlpe . "$absolute_dst")

(যা উপরে উল্লিখিত বেশিরভাগ সমস্যার ক্ষেত্রেও কাজ করবে তবে $dstনতুন লাইনের চরিত্রগুলিতে যদি নিখুঁত পথটি শেষ হয় তবে ব্যর্থ হবে )।

এখন এটি জিএনইউ / লিনাক্স সিস্টেমগুলিতে সহায়তা করবে না যেখানে নেই pax

এটি লক্ষণীয় আকর্ষণীয় যে paxএটি পসিক্স দ্বারা তৈরি tarএবং cpioকমান্ডের বৈশিষ্ট্যগুলিকে মার্জ করার জন্য তৈরি করেছিল ।

cpioপসিক্স আবিষ্কারের বিপরীতে একটি historical তিহাসিক ইউনিক্স কমান্ড (1977 সাল থেকে), এবং একটি জিএনইউ বাস্তবায়নও রয়েছে ( paxএকটিও নয়)। সুতরাং এটি আর কোনও স্ট্যান্ডার্ড কমান্ড না থাকলেও (এটি যদিও SUSv2 তে ছিল) তবে এটি এখনও খুব সাধারণ এবং আপনি সাধারণত নির্ভর করতে পারেন এমন বৈশিষ্ট্যের একটি মূল সেট রয়েছে।

সমতুল্য pax -rwlহবে cpio -pl। যাহোক:

  1. cpio আর্গুমেন্টের বিপরীতে স্টিডিনে ইনপুট ফাইলের তালিকা গ্রহণ করে (নিউলাইন সীমানা যার অর্থ নতুন লাইনের অক্ষরযুক্ত ফাইলের নাম সমর্থিত নয়)
  2. সমস্ত ফাইল নির্দিষ্ট করতে হবে (সাধারণত আপনি এটিকে আউটপুট খাওয়ান find( findএবং cpioএকই লোকেরা যৌথভাবে বিকাশ করেছিলেন))।
  3. মেটাডেটা সংরক্ষণ করা হয় না (কিছু cpioপ্রয়োগে কিছু সংরক্ষণের বিকল্প রয়েছে, তবে কিছুই বহনযোগ্য নয়)।

তাই দিয়ে cpio:

absolute_dst=$(umask 077 && mkdir -p -- "$dst" && cd -P -- "$dst" && pwd -P) &&
(cd -P -- "$src" && find . | cpio -pl "$absolute_dst")

দেখে মনে হচ্ছে যে -s / এ / বি / আমার উদাহরণের সাথে সুনির্দিষ্ট। উত্স ডিরেক্টরি নাম এবং টার্গেট ডিরেক্টরি নাম ভেরিয়েবল $ সোর্সডির এবং $ টার্গেটডির হলে আপনি কী করবেন?
গুডমুন্ডুর অর্ন

গুডমুন্ডুরআরন, সম্পাদনা দেখুন।
স্টাফেন চেজেলাস

আমি এই কমান্ডটি ওএস এক্স-তে চালাচ্ছি এবং কেবল "প্যাক্স: ফাইলটিকে নিজের সাথে সংযুক্ত করতে অক্ষম" প্যাক্স একটি ত্রুটি বার্তা পেয়েছি। আমি আপনার আদেশটি অক্ষরে অক্ষরে ব্যবহার করেছি, কেবল উত্স ডিরেক্টরিটি প্রকৃত নাম দিয়ে প্রতিস্থাপন করে / এ / বি রেখেছি এবং চূড়ান্ত বিন্দুটি রেখেছি। আমি কি কিছু ভুল বুঝছি?
db

@ ডিবি, -s /A/Bপ্রতিস্থাপন Aকরে Bযাতে dirAহয়ে যায় dirB। যদি আপনার উত্স ডিরেক্টরি নামটি না থাকে A, তবে এটি এটিকে অনুলিপি করবে (লিঙ্ক করুন)। সম্ভবত আরও ভাল পদ্ধতির জন্য উত্তরটির বাকি অংশটিও দেখুন।
স্টাফেন চেজেলাস


2

আপনি যদি সেই ফাইলগুলির অনুলিপি বা হার্ডলিংকের বৈশিষ্ট্যটি সন্ধান করেন তবে আপনার ফাইলগুলিতে (সমস্ত বা অংশ) স্ন্যাপশট বা ব্যাকআপ নিতে rsnapshot


1
ইহা আকর্ষণীয়. তবে আমার ধারণা হার্ড-লিঙ্কগুলি কেবলমাত্র একটি ভাল স্ন্যাপশট প্রক্রিয়া যদি ফাইলগুলি সংশোধন করা না যায়। রাইট?
গুডমুন্ডুর অরন

@ গুডমুন্ডুর অর্ন; এটা সঠিক। আমার উত্তরে উল্লিখিত সরঞ্জামটি এমনভাবে একটি নতুন স্ন্যাপশট তৈরি করবে যাতে ফাইলগুলি অনন্য; যেমন বিদ্যমান (অশোধিত) ফাইলগুলিকে হার্ডলিঙ্ক হিসাবে তৈরি করা হবে এবং নতুন ফাইল (বা বিদ্যমান ফাইলগুলির পরিবর্তিত সংস্করণ) নতুন ফাইল হিসাবে তৈরি করা হবে। সুতরাং ফলস্বরূপ আপনার সর্বনিম্ন অপ্রয়োজনীয়তা থাকবে।
জ্যানিস

0

@ গুডমুন্ডুর-অরনের উত্তরটি সঠিক, তবে আপনি যদি লিনাক্সের বিটিআরএফএসে থাকেন তবে এই তাত্ক্ষণিকতার cp a --reflink=auto dirA dirBসাথে ফাইলগুলি প্রকৃতপক্ষে পৃথক এবং পরিবর্তনের ফলে অন্যটির পরিবর্তন হয় না। আপনি cp -cম্যাকের সাথে এপিএফএসের মাধ্যমে বেশিরভাগ ক্ষেত্রেই এটি অর্জন করতে পারেন ( autoসম্ভব না হলে একটি সম্পূর্ণ অনুলিপি -cকরবেন, ব্যর্থ হবে)।

যে কোনও সিডাব্লু ফাইল সিস্টেম এটি করতে সক্ষম হওয়া উচিত, তবে বিক্রেতারা একটি মানক কমান্ড লাইন বিকল্পের সাথে একমত হননি।

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