জায়গাটিতে কোনও হার্ড-লিঙ্কটি ভঙ্গ করছেন?


13

আমি আমার ডটফাইলগুলিকে সংস্করণ নিয়ন্ত্রণে রাখছি এবং তাদের নিযুক্ত স্ক্রিপ্টটি শক্ত লিঙ্কগুলি তৈরি করে। আমি etckeeperআমার /etcআন্ডার ভার্সন নিয়ন্ত্রণ রাখতেও ব্যবহার করি । সম্প্রতি আমি এই জাতীয় সতর্কতা পেয়েছি:

warning: hard-linked files could cause problems with bzr

একটি সাধারণ অনুলিপি ( cp filename.ext filename.ext) কাজ করবে না:

cp: `filename.ext' and `filename.ext' are the same file

কোনও ফাইলের নাম পরিবর্তন / সরানো - খণ্ড খণ্ডগুলি বাদে - হার্ড-লিঙ্কটিও ভেঙে যায় না।

সুতরাং আমার প্রশ্নটি হ'ল: কোনও ফাইলের হার্ড-লিঙ্কটি ভেঙে ফেলার উপায় কি আসলেই না জেনে রাখা হয়েছিল যে সেই ফাইলটির অন্যান্য হার্ড-লিঙ্ক / গুলি কোথায় / আছে?


2
"Rm" কমান্ডটি হার্ড লিঙ্কগুলিকে বিরতি দেয়।
জোহান

উত্তর:


14
cp -p filename filename.tmp
mv -f filename.tmp filename

এটিকে লিপিযোগ্য করে তোলা:

dir=$(dirname -- "$filename")
tmp=$(TMPDIR=$dir mktemp)
cp -p -- "$filename" "$tmp"
mv -f -- "$tmp" "$filename"

প্রথমে অনুলিপিটি করা, তারপরে এটি স্থানান্তরিত করা, এর সুবিধা রয়েছে যে ফাইলটি পরমাণুগতভাবে একটি পৃথক অনুলিপি হিসাবে একটি হার্ড লিঙ্ক হতে পরিবর্তিত হয় ( filenameআংশিক বা অনুপস্থিত যেখানে সময় নেই)।


7

আপনি সম্ভবত এটি বোঝাতে চাইছেন যে আপনি হার্ড-লিঙ্কটি আলাদা, স্বতন্ত্র ফাইলে বিভক্ত করতে চান।

mv hardlink tempname && cp tempname hardlink && rm tempname

একটি হার্ডলিঙ্ক হ'ল ডিরেক্টরিতে একটি এন্ট্রি এবং ডিস্কের ইনোড ব্লকের মধ্যে সংযোগ।

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

নির্বিশেষে, ফাইলের নামের (যা ls কমান্ড উত্পাদন করে) এবং এই মেটা-ডেটা সংরক্ষণ করে এমন ইনোড ব্লকের মধ্যে সংযোগকে একটি হার্ড লিঙ্ক বলা হয়।

একটি একক ফাইলে একাধিক হার্ড লিঙ্ক থাকা মানেই একই ইনোডকে একাধিক ডিরেক্টরি এন্ট্রি দ্বারা উল্লেখ করা হয়, সম্ভবত বিভিন্ন ডিরেক্টরিতে (একক ফাইল সিস্টেমে)

আরএম ডিরেক্টরি থেকে ফাইলের নাম এন্ট্রি মুছে দেয়। একবার কোনও ইনড কোনও ফাইল দ্বারা রেফারেন্স করা না হলে তার স্থানটি অন্য ফাইলগুলি ব্যবহারের জন্য ছেড়ে দেওয়া হয়।


প্রকৃতপক্ষে. এটি cpএবং mvউদাহরণগুলি বোঝায় । সুতরাং কোনও অস্থায়ী ফাইল ব্যবহার করার উপায় নেই, আমি দেখছি।
0xC0000022L

@ 0xC0000022L, না, আইওনডগুলিতে অন্য ইনোডগুলিতে পয়েন্টার নেই। কেবলমাত্র ডেটা ব্লকগুলিতে (বা বস্তু ছোট হলে তারা ডেটা স্পেস হিসাবে দ্বিগুণ করতে পারে)।
ভনব্র্যান্ড

4
অনুলিপি করার সময় অনুমতি এবং অন্যান্য ডেটা সংরক্ষণ করা হয়েছে তা নিশ্চিত করুন, i .e। ব্যবহার করুন cp -a(কমপক্ষে জিএনইউ কোর্টিল)।
ভনব্র্যান্ড

@ 0xC0000022L, যদি আপনি সাবধানে দেখুন, মূল ফাইলের জন্য কেবলমাত্র একটি অস্থায়ী নাম রয়েছে, কেবলমাত্র শেষ ধাপে একটি নতুন ফাইল তৈরি করা হবে।
ভোনব্র্যান্ড

@ ভনব্র্যান্ড তারা কী ফাইল সিস্টেমটি ব্যবহার হচ্ছে তার উপর নির্ভর করে প্রকৃতপক্ষে পারেন।
জোহান

4

এটি আপনার ~ / .bashrc ফাইলের শেষে রাখুন।

delink () { tmpfile="$1$(date)"; cp -a "$1" "$tmpfile"; mv "$tmpfile" "$1"; }

এভাবে চালাও

delink filename

3

ব্যাশ স্ক্রিপ্টের সাহায্যে এটি করার সর্বোত্তম উপায় হ'ল কিছু হবে:

if [ -f "$1" ] ; then
dir="$(dirname -- "$1")"
tmpfile="$(mktemp --tmpdir="$dir")"
cp --preserve=all -f -- "$1" "$tmpfile"
mv -f -- "$tmpfile" "$1"
fi

লক্ষ করার বিষয়গুলি:

  • অনুলিপি করার চেষ্টা করার আগে ফাইলটি নিয়মিত ফাইল কিনা তা পরীক্ষা করে দেখুন
  • অনুলিপি প্রস্তুত না হওয়া পর্যন্ত পুরানো ফাইলটি জায়গায় রাখুন
  • mktempকোনও ফাইল তৈরি করতে ব্যবহার করুন যা না থাকার নিশ্চয়তা রয়েছে
  • -fওভাররাইট জোর --preserve=allকরতে এবং মূল ফাইলের সাথে মেটাডেটা যথাসম্ভব অনুরূপ রাখতে ব্যবহার করুন
  • শূন্যস্থান এবং / অথবা শুরু দিয়ে পাথগুলি ব্যবহার করুন --এবং "উদ্ধৃত করুন-

অস্থায়ী ফাইল তৈরি না করে প্রতিস্থাপন করা বর্তমান (৩.১16) লিনাক্স সিস্টেম কলগুলির মাধ্যমে সম্ভব নয়: যদিও কোনও ফাইলকে পরমাণুভাবে ওভাররাইট করা সম্ভব (যেমন, পুরানো ফাইলটি সরিয়ে একটি একক ক্রিয়াকলাপ হিসাবে নতুন ফাইলের পরিবর্তে), এটি ফাইল সিস্টেমে কোনও নাম নেই এমন ফাইলের সাহায্যে এটি করা সম্ভব নয় (যেমন ফাংশনের O_TMPFILEপতাকা ব্যবহার করে একটি অস্থায়ী ফাইল তৈরি করা হয়েছে open) কারণ renameফাংশনটির জন্য ইনপুট হিসাবে একটি ফাইলের নাম প্রয়োজন হয় (কোনও সংস্করণ নেই renameযা কোনও ফাইল বর্ণনাকারীর ইনপুট হিসাবে নেয় - দেখতে এখানে বিস্তারিত জানার জন্য)


1
মনে রাখবেন যে আপনি নিজের dirnameএবং mktempকলগুলিতে নামটি উদ্ধৃত করতে ব্যর্থ হয়েছেন । আপনার জন্য এটি স্থির ...
ডার্বার্ট

@ আড্ডারবাট ওহ আপনাকে ধন্যবাদ, তবে এগুলি কার্যকর হবে না কারণ এখানে নেস্টেড ডাবল কোটস রয়েছে ... আরও একটি ঠিক করা দরকার! কিন্ডা
বাষকে

3
$( ... )স্টাইল কমান্ডের বিকল্পের কারণে এটি কাজ করবে । ` ... `স্টাইলের চেয়ে সুন্দর এটির একটি কারণ ।
ডার্বোবার্ট

@डरবার্ট চমৎকার, এটি জানেন না। এছাড়াও, আপনি কীভাবে ইনলাইন কোড ট্যাগের ভিতরে? ব্যবহার করতে পারেন?
pqnet

আপনি তাদের পিছনে ফেলে পালাতে পারেন। সুতরাং আপনাকে অন্তর্ভুক্ত করার জন্য `: `\``(অবশ্যই, আমি ডাবল পলায়ন করেছি যে এটি আপনি কী টাইপ করেন তা দেখানোর জন্য)।
ডার্বোবার্ট

-1

আপনি যে আদেশটি সন্ধান করছেন তা হ'ল unlink


সম্ভবত আমার প্রশ্নটি পরিষ্কার ছিল না, তবে "ইন-প্লেস" এবং এর উদাহরণগুলির দ্বারা cpএবং mvআমি বোঝাতে চাইছিলাম যে আমি ফাইলটি পরে উপস্থিত থাকতে চাই।
0xC0000022L

আহ, আমি এটি পরিষ্কার পেয়েছি না, না। আপনার অবশ্যই জোহানের উত্তর নিয়ে যাওয়া উচিত।
জেনি ডি

1
"আনইলিংক" কমান্ডটি কেবল ফাইলটি মুছে ফেলে (আনলিংক () সিস্টেম কলটি কী করে)।
রাউল সালিনাস-মন্টেইগুডো

-1

যদি আপনি এই ফাইলটির হার্ডলিঙ্কযুক্ত সমস্ত ফাইলের সন্ধান করেন তবে আপনি ব্যবহার করতে পারেন:

find -samefile myknowhardlinkfile

এছাড়াও ls -il myknowhardlinkfileআপনি একই inode (তৃতীয় ক্ষেত্র) থেকে hardlinked ফাইলের নাম সংখ্যা প্রদর্শন করবে।

101612442 -rw-rw-r--. 2 me me 0 Aug  5 07:07 myknowhardlinkfile

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