হার্ডলিঙ্কগুলির সাথে সিপির আচরণ দেখে অবাক


20

আমি হার্ডলিঙ্কগুলির ধারণাটি খুব ভালভাবে বুঝতে পেরেছি cpএবং --- এবং এমনকি সাম্প্রতিক পসিক্স স্প্যাক্স --- এর জন্য বেশ কয়েকটি মৌলিক সরঞ্জামগুলির জন্য ম্যান পৃষ্ঠাগুলি পড়েছি । তবুও আমি নিম্নলিখিত আচরণগুলি পর্যবেক্ষণ করে অবাক হয়েছি:

$ echo john > john
$ cp -l john paul
$ echo george > george

এই মুহুর্তে johnএবং paulএকই ইনোড (এবং সামগ্রী) georgeথাকবে এবং উভয় দিক থেকে পৃথক হবে। এখন আমরা করি:

$ cp george paul

এই মুহুর্তে আমি আশা georgeএবং paulবিভিন্ন inode সংখ্যার কিন্তু একই বিষয়বস্তু --- এই প্রত্যাশা পূর্ণ হয়েছিল আছে --- কিন্তু আমি আরো আশা paulএখন থেকে একটি ভিন্ন inode সংখ্যা আছে john, এবং johnএখনও বিষয়বস্তু আছে john। এখানেই আমি অবাক হয়েছি। দেখা যাচ্ছে যে গন্তব্য পথে কোনও ফাইল অনুলিপি করার paulপরেও একই ফাইলটি (একই ইনোড) অন্য সমস্ত গন্তব্য পথে শেয়ার করা paulহয়েছে যা ইনোড ভাগ করে in আমি ভাবছিলাম cpযা একটি নতুন ফাইল তৈরি করে এবং এটি পুরানো ফাইল দ্বারা দখল করা জায়গায় স্থানান্তরিত করে paul। পরিবর্তে এটি যা করায় মনে হচ্ছে তা হ'ল বিদ্যমান ফাইলটি খোলার paul, এটি কেটে ফেলা এবং লিখতেgeorgeবিদ্যমান ফাইলটিতে লিখিত সামগ্রী। সুতরাং একই ইনোডযুক্ত যে কোনও "অন্যান্য" ফাইল একই সাথে "তাদের" সামগ্রী আপডেট করে।

ঠিক আছে, এটি একটি নিয়মতান্ত্রিক আচরণ এবং এখন আমি এটির আশা করতে জানি আমি কীভাবে এটির আশেপাশে কাজ করতে পারি, বা যথাযথ হিসাবে এটির সুবিধা নিতে পারি। আমার কোথায় ধাঁধা আছে যেখানে আমার এই আচরণের নথিভুক্তি দেখার কথা ছিল? আমি ইতিমধ্যে তাকিয়েছি এমন নথিগুলিতে এটি কোথাও নথিভুক্ত না হলে আমি অবাক হব । তবে আপাতদৃষ্টিতে আমি এটি মিস করেছি এবং এখন এমন কোনও উত্স খুঁজে পাচ্ছি না যা এই আচরণটি নিয়ে আলোচনা করে।

উত্তর:


4

প্রথম, কেন এটি এভাবে করা হয়? একটি কারণ historicalতিহাসিক: এটি ইউনিক্স প্রথম সংস্করণে এটি করা হয়েছিল ।

ফাইলগুলি জোড়া নেওয়া হয়; প্রথমটি পড়ার জন্য খোলা হয়, দ্বিতীয়টি তৈরি করা মোড 17 Then তারপরে প্রথমটি দ্বিতীয়টিতে অনুলিপি করা হয়।

"তৈরি" বলতে creatসিস্টেম কলকে বোঝায় (এটি একটি বিখ্যাতভাবে একটি ই অনুপস্থিত ), যা বিদ্যমান ফাইলটি যদি সেখানে থাকে তবে প্রদত্ত নামের দ্বারা সংক্ষিপ্ত করে তোলে।

এবং এখানেcp ইউনিক্স দ্বিতীয় সংস্করণের উত্স কোডটি (আমি প্রথম সংস্করণের উত্স কোডটি খুঁজে পাচ্ছি না)। আপনি openউত্স ফাইল এবং creatদ্বিতীয় ফাইলের জন্য কলগুলি দেখতে পারেন ; এবং, প্রথম সংস্করণের উন্নতি হিসাবে, যদি দ্বিতীয় ফাইলটি একটি বিদ্যমান ডিরেক্টরি cpহয় তবে সেই ডিরেক্টরিতে একটি ফাইল তৈরি করে।

তবে, আপনি জিজ্ঞাসা করতে পারেন, সেই সময় কেন এটি করা হয়েছিল? "কেন ইউনিক্স মূলত সেভাবে এটি করেছিল" এর উত্তর প্রায় সর্বদা সরলতা। cpপড়ার জন্য এর উত্সটি খোলে এবং তার গন্তব্য তৈরি করে - এবং সিস্টেম কল করার জন্য একটি ফাইল তৈরির জন্য একটি ফাইলকে লেখার জন্য এটি খোলার মাধ্যমে ওভাররাইট করে দেয়, কারণ কলারটি ফাইলটি ইতিমধ্যে বিদ্যমান ছিল কিনা তা প্রদত্ত নামে একটি ফাইলের বিষয়বস্তু চাপিয়ে দেওয়ার অনুমতি দেয় allows না.

এখন এটি কোথায় নথিবদ্ধ হয়েছে: ফ্রিবিএসডি ম্যান পৃষ্ঠাতে

ইতিমধ্যে বিদ্যমান প্রতিটি গন্তব্য ফাইলের জন্য, অনুমতিগুলি অনুমতি দিলে এর সামগ্রীগুলি ওভাররাইট করা হয়। এর মোড, ব্যবহারকারী আইডি এবং গোষ্ঠী আইডি অপরিবর্তিত রয়েছে যদি না -p বিকল্পটি নির্দিষ্ট না করা হয়।

সেই শব্দবন্ধটি কমপক্ষে 1990 সাল পর্যন্ত উপস্থিত ছিল (বিএসডি যখন 4.3BSD ছিল তখন) সোলারিস 10 তে একই শব্দ রয়েছে :

যদি টার্গেট_ফাইলে বিদ্যমান থাকে, সিপি তার সামগ্রীগুলিকে ওভাররাইট করে তবে মোড (এবং প্রযোজ্য ক্ষেত্রে এসিএল), মালিক এবং এর সাথে যুক্ত গোষ্ঠী পরিবর্তন করা হয় না।

আপনার কেসটি এমনকি এইচপি-ইউএক্স 10 ম্যানুয়ালটিতেও বানান :

নতুন_ফায়াল যদি অন্য লিঙ্কের সাথে একটি বিদ্যমান ফাইলে একটি লিঙ্ক হয়, বিদ্যমান ফাইলটি ওভাররাইট করে এবং সমস্ত লিঙ্ক ধরে রাখে।

পসিক্স স্ট্যান্ডার্ডিতে রাখে। একক ইউনিক্স ভি 2 এর উদ্ধৃতি :

ডেসট_ফাইল যদি বিদ্যমান থাকে তবে নিম্নলিখিত পদক্ষেপ গ্রহণ করা হয়েছে: (…) ডেসট_ফাইলের জন্য একটি ফাইল বর্ণনাকারী XSH স্পেসিফিকেশন ওপেন () ফাংশনের সমান ক্রিয়া সম্পাদন করে পাথ আর্গুমেন্ট হিসাবে ডেট_ফাইল ব্যবহার করে এবং O_WRONLY এবং O_TRUNC এর বিটওয়াস ইনক্লুসিভ OR দ্বারা প্রাপ্ত হবে… oflag আর্গুমেন্ট হিসাবে।

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

আপনি জিএনইউ কোর্টিল ম্যানুয়ালটির বিরুদ্ধে ডকুমেন্টেশন বাগের প্রতিবেদন করতে চাইতে পারেন , কারণ এটি এই আচরণটি নথিভুক্ত করে না। এমনকি আপনার দৃশ্যে লিঙ্কটি সরিয়ে ফেলা এবং একটি নতুন ফাইল তৈরি হওয়ার --preserve=linksদিকে পরিচালিত করবে এমন বিবরণ এমনকি paulকী হয় তা পরিষ্কার করে দেয় না --preserve=links-fধরণের বর্ণনা দিয়ে বোঝা যায় এটি ব্যতীত যা ঘটে তবে তা বানান করে না ("এই বিকল্পটি অনুলিপি করার সময় এবং কোনও বিদ্যমান গন্তব্য ফাইল লেখার জন্য খুলতে পারে না, তবে অনুলিপি ব্যর্থ হয়। তবে - ফোর্স সহ…")।


আপনি কেন বলছেন যে "কারণ এটি কলার ফাইল ফাইলটির মালিকানা নিতে দেয় যে ফাইলটি ইতিমধ্যে আছে কিনা"? সিপি একটি বিদ্যমান বিদ্যমান ফাইলের মালিকানা নেয় না।
jrw32982 মনিকা 22

@ jrw32982 আমার অর্থ ফাইলের মধ্যে কী আছে সেটি সিদ্ধান্ত নেওয়ার অর্থে মালিকানা বলতে চাওয়া, ফাইল মেটাটাটা অর্থে মালিকানা নয়। আমি সেই বাক্যটি আবার লিখেছি।
গিলস 'অশুভ হওয়া বন্ধ করুন'

20

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

এছাড়াও মনে রাখবেন যে যদি cpপ্রাক-বিদ্যমান গন্তব্য ফাইলগুলি "প্রতিস্থাপন" করা হয়, তবে এটি সম্ভবত অবাক করা বা ভুল হিসাবে বিবেচিত হতে পারে, সম্ভবত "ওভাররাইটিং" এর চেয়ে বেশি। উদাহরণ স্বরূপ:

  • যদি cpপ্রথমে পুরানো ফাইলটি মুছে ফেলা হয় এবং তারপরে একটি নতুন ফাইল তৈরি করা হয় তবে সময়ের ব্যবধানে ফাইলটি অনুপস্থিত থাকায় অবাক হওয়ার কিছু থাকবে।
  • যদি cpপ্রথমে কোনও অস্থায়ী ফাইল তৈরি করা হয় এবং তারপরে এটি স্থানান্তরিত হয় তবে অদ্ভুত নামযুক্ত অস্থায়ী ফাইলগুলি মাঝে মধ্যে লক্ষ করা যায় এই কারণে এটি সম্ভবত এটি নথিভুক্ত করা উচিত ... তবে তা হয় না।
  • তাহলে cpঅনুমতির কারণে পুরনো ফাইল হিসাবে একই ডিরেক্টরির মধ্যে একটি নতুন ফাইল তৈরি করতে পারে নি তারপর এই দুর্ভাগা হবে (এটি আগে থেকেই পুরানো এক মুছে দেওয়া, বিশেষ করে যদি)।
  • যদি ফাইলটি চলমান ব্যবহারকারীর মালিকানাধীন না থাকে cpএবং ব্যবহারকারী চলমান cpনা থাকে rootতবে নতুন ফাইলটির মালিকদের সাথে নতুন ফাইলটির অনুমতি এবং অনুমতিগুলির সাথে মিল পাওয়া অসম্ভব।
  • যদি ফাইলটিতে অভিনব বিশেষ বৈশিষ্ট্য থাকে যা cpসম্পর্কে জানে না, তবে অনুলিপিটিতে নষ্ট হয়ে যাবে। আজকাল বাস্তবায়িত হওয়া cpউচিত বর্ধিত বৈশিষ্ট্যের মতো বিষয়গুলি নির্ভরযোগ্যভাবে বোঝার জন্য, তবে এটি সর্বদা এটি ছিল না। এবং ম্যাকোস রিসোর্স কাঁটাচামচ, বা, দূরবর্তী ফাইল সিস্টেমের জন্য মূলত যে কোনও জিনিস রয়েছে।

সুতরাং উপসংহারে: এখন আপনি cpসত্যিই কি জানেন । আপনি এর দ্বারা আর কখনও অবাক হবেন না! সত্যিই, আমি মনে করি একই জিনিসটি আমার অনেক বছর আগেও ঘটেছিল।


পসিক্স রেফারেন্সটি পরীক্ষা করে দেখতে হবে, তবে আসলে বিএসডি-তে (কমপক্ষে ওএসএক্স) এবং জ্ঞানু সংস্করণের manপৃষ্ঠাগুলি "ওভাররাইটিং" সম্পর্কে এতটা স্পষ্ট নয়। এই শব্দটি কেবলমাত্র বিকল্পসমূহ এবং মন্তব্যে ব্যবহৃত হয় । Gnu র manpage বিশেষত Uninformative, শুরু হয়েছে বাসদ / Mac এর অন্তত র manpage বলছেনcpcp-i-nCopy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.In the first synopsis form, the cp utility copies the contents of the source_file to the target_file.
dubiousjim

‘cp’ copies files (or, optionally, directories). The copy is completely independent of the original.
জ্ঞান কোর্টিলস

2
আমি দেখতে পাচ্ছি যে POSIX 2008 স্ট্যান্ডার্ডটি পর্যবেক্ষণ আচরণটি নির্দিষ্ট করে; আমি একটি উত্তর যুক্ত করব।
dubiousjim

16

আমি দেখতে পাচ্ছি যে পসিক্স 2013 মান পর্যবেক্ষণিত আচরণটি নির্দিষ্ট করে । এটা বলে:

  1. সোর্স_ফাইলে যদি নিয়মিত ফাইল টাইপ হয় তবে নিম্নলিখিত পদক্ষেপ নেওয়া হবে:

    ক। ... যদি ভাগ্য_ ফাইল উপস্থিত থাকে, নিম্নলিখিত পদক্ষেপ নেওয়া হবে:

    আমি। তাহলে -iবিকল্প কার্যকরী হলে, cpইউটিলিটি মান ত্রুটির একটি প্রম্পট লিখতে এবং স্ট্যান্ডার্ড ইনপুট থেকে একটি লাইন পড়া যাবে। যদি প্রতিক্রিয়াটি ইতিবাচক না cpহয় তবে উত্স_ফাইলে আরও কিছু করা উচিত নয় এবং অন্য কোনও ফাইলগুলিতে যেতে হবে।

    আ। জন্য একটি ফাইল বর্ণনাকারী dest_file সমতূল্য ক্রিয়া করা দ্বারা প্রাপ্ত হইবে open()ফাংশন POSIX.1-2008 সিস্টেম ইন্টারফেস ভলিউম সংজ্ঞায়িত ব্যবহার নামক dest_file পথ আর্গুমেন্ট হিসাবে, এবং bitwise-সমেত ORএর O_WRONLYএবং O_TRUNCযেমন oflag যুক্তি।

    III। যদি কোনও ফাইল বর্ণনাকারী প্রাপ্তির প্রচেষ্টা ব্যর্থ হয় এবং -fবিকল্পটি কার্যকর হয়, পাথ আর্গুমেন্ট হিসাবে ডেসটাইট ফাইল ব্যবহার করে POSIX.1-2-2008 এর সিস্টেম ইন্টারফেস ভলিউমের সংজ্ঞায়িত ফাংশনের cpসমান ক্রিয়াকলাপ সম্পাদন করে ফাইলটি সরিয়ে ফেলার চেষ্টা করা উচিত । যদি এই প্রচেষ্টা সফল হয়, তবে পদক্ষেপ 3 বি দিয়ে চালিয়ে যেতে হবে।unlink()cp

    ...

    ঘ। উত্স_ ফাইলের বিষয়বস্তু ফাইল বর্ণনাকারীর কাছে লিখিত হবে। যে কোনও লিখন ত্রুটি cpস্ট্যান্ডার্ড ত্রুটিতে ডায়াগনস্টিক বার্তা লিখতে এবং 3e পদক্ষেপ অবিরত করতে পারে।

    ঙ। ফাইল বর্ণনাকারী বন্ধ করা হবে।


1
মজাদার. আপনার মতো, আমিও ধরে নিয়েছিলাম যে cpএকইরকম ফলাফল দেবে mvএবং যে কোনও কট্টর লিঙ্কগুলি ভাগ্যের অংশ break তবে এখন আমি এটি সম্পর্কে চিন্তাভাবনা করি, এর অর্থ হ'ল এটি নির্দিষ্টভাবে unlink(2)লক্ষ্য ( cp -f) করতে হবে, বা কোনও আলাদা-নামযুক্ত অস্থায়ী এবং তারপরে rename(2)এটি তৈরি করতে হবে। সোজা বাস্তবায়ন হ'ল ওভাররাইটের জন্য ফাইলটি খোলার জন্য যা পসিক্সের প্রয়োজন। এটি এর সমতুল্যcat src > dest
পিটার কর্ডেস

2

যদি আপনি বলতে পারেন, "গন্তব্য পথে কোনও ফাইল paul অনুলিপি করা একই ফাইল (একই ইনোড) অনুলিপি করে এমন সমস্ত গন্তব্য পাথগুলিতে অনুলিপি করে paul” ", আমি দুঃখিত যে আপনি ধারণাটি বুঝতে পারছেন না হার্ড লিঙ্কগুলি খুব ভাল। আমি যদি স্যার ম্যাককার্টনিকে একটি আপেল দিই তবে আমি পলকে একটি আপেল দিয়েছি এবং জন লেননের গীতিকার অংশীদারকে আমি একটি আপেল দিয়েছি। তবে আমি তিনটি আপেল বের করি নি; আমি এমন এক ব্যক্তিকে একটি আপেল দিয়েছি যার একাধিক নাম / উপাধি / বর্ণনাকারী রয়েছে।

একইভাবে, যখন আপনি অনুলিপি georgeকরতে paul, তাই না এছাড়াও এটি কপি john। পরিবর্তে, আপনি georgeযে ফাইলের ইনোড paulডিরেক্টরি এন্ট্রি দ্বারা নির্দেশিত হয় সেই ফাইলটিতে ডেটা অনুলিপি করছেন ।

ধাপে ধাপ:   আপনি যখন করবেন

echo john > john

আপনি একটি নতুন ফাইল তৈরি করেছেন (ধরে নেওয়া যে johnসেই ডিরেক্টরিতে ইতিমধ্যে কোনও ফাইল নেই )। অথবা আরও কঠোরভাবে বলতে গেলে, এটি ধরে নেওয়া হচ্ছে যে সেই ডিরেক্টরিতে নামের সাথে একটি ডিরেক্টরি এন্ট্রি ইতিমধ্যে ছিল না john(কারণ, কঠোরভাবে বলতে গেলে, ডিরেক্টরিতে কোনও ফাইল নেই; কেবল ডিরেক্টরি প্রবেশিকা, যা ইনোডগুলিতে নির্দেশ করে)। আপনি করার পরে

cp -l john paul

অথবা

ln john paul

আপনি একটি নতুন ফাইল তৈরি করেন নি; বরং আপনি আপনার বিদ্যমান ফাইলটিকে একটি নতুন নাম দিয়েছেন। আপনার কাছে এখন দুটি নাম সহ একটি ফাইল রয়েছে: johnএবং paul। এবং যখন আপনি বলেন

cp george paul

আপনি সেই ফাইলটি ওভাররাইট করছেন । এটির দুটি নাম থাকার বিষয়টি অপ্রাসঙ্গিক; এটিতে 42 টি নাম থাকতে পারে, সম্ভবত আপনি যে জায়গাগুলি অ্যাক্সেস করতে পারবেন না সেখানেও এই আদেশটি george\nসেই সমস্ত নাম (পাথ )গুলিতে ডেটা অনুলিপি করছে না ; এটি কেবলমাত্র এক ফাইলে ডেটা অনুলিপি করছে যার একাধিক নাম রয়েছে।


1
ধন্যবাদ। ঠিক আছে, আমি যেভাবে লিখছিলাম সে সম্পর্কে ভয়ের-উদ্ধৃতিগুলির প্রয়োজনীয় চরিত্রটি সম্পর্কে আমি অবগত ছিলাম: johnএবং paulএকই ফাইলের জন্য দুটি পথের নাম হিসাবে শুরু করব। তবে আমি নিজেকে প্রকাশ করার পক্ষে ভাবতে সবচেয়ে সহজ উপায় ছিল। আমি একটি কঠিন লিংক নিছক ধারণা মনে করি না সঠিকভাবে বোঝা, না নির্দেশনা দুই আচরণে কোনটাকে cp(ছাড়া -l)।
dubiousjim

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