আপনি কীভাবে আসল হার্ড লিঙ্কটি এলএস দ্বারা দেখতে পাচ্ছেন?


97

আমি দৌড়াই

ln /a/A /b/B

আমি ফোল্ডারে দেখতে চাই aযেখানে একটি ফাইল A ফাইলটি নির্দেশ করে ls


1
হার্ড লিঙ্কগুলি পয়েন্টার নয়, সিমলিঙ্কগুলি। তারা একই ফাইলের জন্য একাধিক নাম (ইনোড)। একটি link(2)সিস্টেম কল করার পরে , কোনটি আসল এবং কোনওটি সেই লিঙ্কটির কোনও ধারণা নেই। এই কারণেই, উত্তরগুলি হিসাবে উল্লেখ করা হয়েছে, সমস্ত লিঙ্কগুলি সন্ধানের একমাত্র উপায় find / -samefile /a/A। কারণ একটি ইনোডের জন্য একটি ডিরেক্টরি এন্ট্রি একই ইনোডের জন্য অন্যান্য ডিরেক্টরি এন্ট্রিগুলিকে "সম্পর্কে" জানে না। তারা যা করে তা হ'ল ইনোডকে পুনরায় গণনা করা হয় যাতে এটির শেষ নামটি যখন মুছে ফেলা যায় unlink(2)ed। (এটি lsআউটপুটে "লিঙ্ক কাউন্ট" )।
পিটার কর্ডেস

@ পিটারকর্ডস: রিফকাউন্টটি আসলে হার্ডলিঙ্ক এন্ট্রিতে সংরক্ষিত আছে? এটিই আপনার কথার দ্বারা বোঝা যায় ("তারা যা কিছু করে তা ইনোডের পুনরায় হিসাব করা ...") তবে লিঙ্কগুলি একে অপরের সম্পর্কে কিছু না জেনে থাকলে তা বোঝা যায় না, যেহেতু যখন কোনও আপডেট হয়, তখন সমস্ত অন্যান্যকে একরকম করতে হবে আপডেট করা। নাকি রেফকাউন্টটি নিজেই ইনোডে সংরক্ষণ করা হয়? (যদি এটি বোবা প্রশ্ন হয় তবে আমাকে ক্ষমা করুন, আমি নিজেকে নবাগত মনে করি এবং আমি এখনও শিখছি)।
লোনবোট

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

উত্তর:


171

এর সাথে আপনার ফাইলের জন্য ইনোড নম্বরটি পেতে পারেন

ls -i

এবং

ls -l

রেফারেন্স গণনা দেখায় (একটি নির্দিষ্ট ইনোডে হার্ডলিঙ্কের সংখ্যা)

আপনি ইনোড নম্বরটি খুঁজে পাওয়ার পরে, আপনি একই ইনোড সহ সমস্ত ফাইল সন্ধান করতে পারেন:

find . -inum NUM

বর্তমান দির (।) এ ইনোড NUM এর জন্য ফাইলের নাম প্রদর্শন করবে


46
আপনি ঠিক খুঁজে চালাতে পারে। -Samefile ফাইলের নাম
BeowulfNode42

1
@ বিউওউলফনোড 42 এই কমান্ডটি দুর্দান্ত তবে এর জন্য কমপক্ষে একই ফাইলগুলির ভাগ করা মূল ফোল্ডারটি দরকার।
Itachi

1
এই উত্তরটি একটি ব্যবহারিক "এটি করুন" দেয় তবে আমি দৃ strongly ়ভাবে অনুভব করি যে @ লরেন্সগনসালভস "কীভাবে" এবং / অথবা "কেন" প্রশ্নের উত্তর দেয়।
ট্রেভর বয়েড স্মিথ

65

আপনার প্রশ্নের সত্যিই একটি সুসংজ্ঞাত উত্তর নেই। সিমলিঙ্কগুলির বিপরীতে, হার্ডলিঙ্কগুলি "মূল ফাইল" থেকে পৃথক পৃথক।

ডিরেক্টরি এন্ট্রিগুলিতে একটি ফাইলের নাম এবং একটি ইনডের পয়েন্টার থাকে। ইনোডে পরিবর্তে ফাইল মেটাডেটা এবং (প্রকৃত ফাইলের বিষয়বস্তুগুলিতে পয়েন্টার) থাকে। একটি হার্ড লিঙ্ক তৈরি করা একই ফাইলের অন্য ফাইলনাম + রেফারেন্স তৈরি করে। এই তথ্যসূত্রগুলি একমুখী (সাধারণত ফাইল সিস্টেমগুলিতে, কমপক্ষে) - ইনোডটি কেবল একটি রেফারেন্স গণনা রাখে। "আসল" ফাইলের নামটি কোনটি খুঁজে বের করার কোনও অভ্যন্তরীণ উপায় নেই।

যাইহোক, এই কারণেই সিস্টেম কল করে একটি ফাইল "ডিলিট" করতে unlink। এটি কেবল একটি হার্ডলিঙ্ক অপসারণ করে। ইনোডের একটি সংযুক্ত ডেটা কেবল তখনই মুছে ফেলা হবে যদি আইনের কোডের রেফারেন্স গণনা 0 এ নেমে আসে।

প্রদত্ত ইনোডের অন্যান্য উল্লেখগুলি খুঁজে পাওয়ার একমাত্র উপায় হ'ল ফাইল সিস্টেমে অনুসন্ধানের মাধ্যমে অনুসন্ধান করা ইনোডকে কোন ফাইলগুলি নির্দেশ করে তা পরীক্ষা করে দেখানো। এই চেকটি সম্পাদন করতে আপনি শেল থেকে 'টেস্ট এ-বিফ বি' ব্যবহার করতে পারেন।


35
এর অর্থ হ'ল অন্য ফাইলের হার্ড লিঙ্কের মতো জিনিস নেই , কারণ মূল ফাইলটিও একটি হার্ড লিঙ্ক; হার্ড লিঙ্কগুলি ডিস্কের একটি অবস্থানকে নির্দেশ করে ।
jtbandes

12
@ জেটব্যান্ডস: হার্ড লিঙ্কগুলি একটি ইনোডের দিকে নির্দেশ করে যা প্রকৃত ডেটাতে নির্দেশ করে।
ড্যাশ 17291

33

ইউএনআইএক্সের কঠোর লিঙ্ক এবং প্রতীকী লিঙ্ক রয়েছে ( যথাক্রমে "ln"এবং এর সাথে তৈরি "ln -s")। সিম্বলিক লিঙ্কগুলি কেবল একটি ফাইল যা অন্য কোনও ফাইলের আসল পাথ থাকে এবং ফাইল সিস্টেমগুলি অতিক্রম করতে পারে।

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

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

আপনি "ls -i"একটি নির্দিষ্ট ফাইলের ইনোড পেতে কমান্ডটি ব্যবহার করতে পারেন । তারপরে "find <filesystemroot> -inum <inode>"প্রদত্ত ইনোড সহ ফাইল সিস্টেমে সমস্ত ফাইল সন্ধান করতে আপনি কমান্ডটি ব্যবহার করতে পারেন ।

এখানে একটি স্ক্রিপ্ট যা ঠিক এটি করে। আপনি এটি দিয়ে:

findhardlinks ~/jquery.js

এবং এটি সেই ফাইল সিস্টেমে সমস্ত ফাইল সন্ধান করবে যা সেই ফাইলটির জন্য হার্ড লিঙ্কসমূহ:

pax@daemonspawn:~# ./findhardlinks /home/pax/jquery.js
Processing '/home/pax/jquery.js'
   '/home/pax/jquery.js' has inode 5211995 on mount point '/'
       /home/common/jquery-1.2.6.min.js
       /home/pax/jquery.js

এখানে স্ক্রিপ্ট।

#!/bin/bash
if [[ $# -lt 1 ]] ; then
    echo "Usage: findhardlinks <fileOrDirToFindFor> ..."
    exit 1
fi

while [[ $# -ge 1 ]] ; do
    echo "Processing '$1'"
    if [[ ! -r "$1" ]] ; then
        echo "   '$1' is not accessible"
    else
        numlinks=$(ls -ld "$1" | awk '{print $2}')
        inode=$(ls -id "$1" | awk '{print $1}' | head -1l)
        device=$(df "$1" | tail -1l | awk '{print $6}')
        echo "   '$1' has inode ${inode} on mount point '${device}'"
        find ${device} -inum ${inode} 2>/dev/null | sed 's/^/        /'
    fi
    shift
done

@ প্যাক্স: লিপিটিতে একটি বাগ রয়েছে বলে মনে হচ্ছে। . ./findhardlinks.bashওএস এক্স এর জেডএসে থাকাকালীন আমি এটি শুরু করি । স্ক্রিনে আমার বর্তমান উইন্ডোটি বন্ধ হয়ে যায়।

4
@ মাসি সমস্যাটি আপনার প্রাথমিক। (উত্স আদেশ হিসাবে একই)। এটি আপনার শেল থেকে প্রস্থান করার জন্য প্রস্থান 1 কমান্ডের কারণ হবে। Chmod a + x findhardlinks.bash ব্যবহার করুন তারপরে এটি ./findhardlinks.bash দিয়ে চালিত করুন বা ব্যাশ ফোল্ডারডিংকস.বাশ ব্যবহার করুন
njsf

দয়া করে, আপনার উত্তর আমার উত্তর দেখুন superuser.com/questions/12972/to-see-hardlinks-by-ls/...
Léo লেয়পল হের্ৎস 준영

3
এই প্রোগ্রামটিমেটিক্যালিটি করতে, আপনি যদি এর পরিবর্তে এটি ব্যবহার করেন তবে এটি সম্ভবত আরও স্থিতিস্থাপক INUM=$(stat -c %i $1)। এছাড়াও NUM_LINKS=$(stat -c %h $1)। আপনি man statব্যবহার করতে পারেন আরও ফর্ম্যাট ভেরিয়েবলের জন্য দেখুন।
জো

সেরা উত্তর, এখন পর্যন্ত। যশ।
মারিয়াসমাতুটিয়

24
ls -l

প্রথম কলামে অনুমতিগুলি উপস্থাপন করবে। দ্বিতীয় কলামটি হবে ফাইলের সাব-আইটেমের (ডিরেক্টরিগুলির জন্য) সংখ্যা বা একই ডেটার পাথের সংখ্যা (মূল লিঙ্ক সহ হার্ড লিঙ্কগুলি)। উদাহরণ:

-rw-r--r--@    2    [username]    [group]    [timestamp]     HardLink
-rw-r--r--@    2    [username]    [group]    [timestamp]     Original
               ^ Number of hard links to the data

2
যদি কোনও প্রদত্ত ফাইলের [অন্যান্য] হার্ড লিঙ্ক থাকে তবে তা নির্ধারণে সহায়ক, তবে তারা কোথায় তা নয়।
mklement0

এছাড়াও, একটি হার্ড লিঙ্ক এবং একটি মূল ফাইলের মধ্যে কোনও প্রযুক্তিগত পার্থক্য নেই। তারা উভয়ই অভিন্ন যে এগুলি কেবল inodeডিস্ক সামগ্রীতে পরিবর্তিত বিন্দুতে নির্দেশ করে।
গায়ারাড

13

নিম্নলিখিত সহজতর সম্পর্কে কীভাবে? (ল্যাটারের উপরের দীর্ঘ স্ক্রিপ্টগুলি প্রতিস্থাপন করতে পারে!)

আপনার যদি একটি নির্দিষ্ট ফাইল থাকে <THEFILENAME>এবং ডিরেক্টরিতে ছড়িয়ে থাকা এর সমস্ত হার্ডলিঙ্কগুলি জানতে চান <TARGETDIR>, (যা এমনকি পুরো ফাইল সিস্টেমের দ্বারা বর্ণিত হতে পারে /)

find <TARGETDIR> -type f -samefile  <THEFILENAME>

যুক্তি প্রসারিত করা, যদি আপনি <SOURCEDIR>একাধিক হার্ড-লিঙ্ক ছড়িয়ে থাকা সমস্ত ফাইলই জানতে চান <TARGETDIR>:

find <SOURCEDIR> -type f -links +1   \
  -printf "\n\n %n HardLinks of file : %H/%f  \n"   \
  -exec find <TARGETDIR> -type f -samefile {} \; 

এটি আমার পক্ষে সেরা উত্তর! তবে আমি ব্যবহার করব না -type fকারণ ফাইলটিও একটি ডিরেক্টরি হতে পারে।
সিলভিও

3
@ সিলভিও: আপনি কেবল ফাইলগুলিতেই হার্ড লিঙ্ক তৈরি করতে পারেন , ডিরেক্টরি নয়।
mklement0

@ এমকিলেটমেন্ট ০: আপনি ঠিক বলেছেন!
সিলভিও

.এবং ..ডিরেক্টরিগুলি থেকে এন্ট্রি hardlinks হয়। লিঙ্ক গণনা থেকে ডিরেক্টরিতে কত সাবডিয়ার রয়েছে তা আপনি বলতে পারেন .। এটি find -samefile .এখনও যাইহোক, যেহেতু এখনও কোনও subdir/..আউটপুট মুদ্রণ করবে না । find(কমপক্ষে জিএনইউ সংস্করণ) ..এমনকি এড়িয়ে চলা হার্ডকোডযুক্ত বলে মনে হচ্ছে -noleaf
পিটার কর্ডেস

এছাড়াও, সেই অনুসন্ধানের সমস্ত-লিঙ্কের ধারণা হ'ল O(n^2)এবং findহার্ডলিঙ্কযুক্ত ফাইলগুলির সেটগুলির প্রতিটি সদস্যের জন্য একবার চালায় । find ... -printf '%16i %p\n' | sort -n | uniq -w 16 --all-repeated=separateকাজ করবে, (2 ^ 63-1 এর দশমিক উপস্থাপনের জন্য 16 যথেষ্ট প্রশস্ত নয়, সুতরাং যখন আপনার এক্সএফএস ফাইল সিস্টেমটি ইনোড সংখ্যার বেশি হওয়ার পক্ষে যথেষ্ট থাকে, তখন নজর রাখুন)
পিটার কর্ডেস

5

একটি ফাইল সিস্টেমে সমস্ত হার্ডলিঙ্কগুলি খুঁজে পেতে স্ক্রিপ্টগুলির সাথে প্রচুর উত্তর রয়েছে। তাদের বেশিরভাগই প্রতি একাধিক -samefileসংযুক্ত ফাইলের জন্য পুরো ফাইল সিস্টেমটি স্ক্যান করতে চালানোর মতো নির্বোধ কাজ করে । এটা পাগলামি; আপনার যা দরকার তা হ'ল ইনোড নম্বর এবং প্রিন্টের নকলগুলি বাছাই করা।

হার্ডলিঙ্কযুক্ত ফাইলগুলির সমস্ত সেট সন্ধান এবং গ্রুপ করার জন্য ফাইল সিস্টেমের উপর দিয়ে কেবল একটি পাস

find dirs   -xdev \! -type d -links +1 -printf '%20D %20i %p\n' |
    sort -n | uniq -w 42 --all-repeated=separate

হার্ডলিঙ্কযুক্ত ফাইলগুলির একাধিক সেট সন্ধানের জন্য অন্যান্য উত্তরগুলির তুলনায় এটি অনেক দ্রুত
find /foo -samefile /barশুধুমাত্র একটি ফাইলের জন্য দুর্দান্ত।

  • -xdev: একটি ফাইল সিস্টেমে সীমাবদ্ধ। কঠোরভাবে প্রয়োজন নেই যেহেতু আমরা ইউনিকের জন্য এফএস-আইডিও প্রিন্ট করি
  • ! -type dডিরেক্টরিগুলি প্রত্যাখ্যান করুন: .এবং ..এন্ট্রিগুলির অর্থ তারা সর্বদা যুক্ত থাকে।
  • -links +1 : লিঙ্ক গণনা কঠোরভাবে > 1
  • -printf ...এফএস-আইডি, ইনোড নম্বর এবং পথ মুদ্রণ করুন। (স্থির কলাম প্রস্থে প্যাডিং সহ যা আমরা বলতে পারি uniq))
  • sort -n | uniq ... শূন্য রেখার সাথে গোষ্ঠীগুলিকে পৃথক করে প্রথম 42 টি কলামগুলিতে সংখ্যা অনুসারে বাছাই করুন এবং পৃথক করুন

ব্যবহারের ! -type d -links +1অর্থ হ'ল সাজ্টের ইনপুটটি ইউনিকের চূড়ান্ত আউটপুটের মতোই বড় তাই আমরা বিপুল পরিমাণ স্ট্রিং বাছাই করছি না। আপনি যদি এটিকে সাব-ডিরেক্টরিতে চালিত না করেন যা কেবলমাত্র হার্ডলিংকের একটি সেট অন্তর্ভুক্ত করে। যাইহোক, এটি অন্য পোস্ট পোস্টযুক্ত সমাধানের তুলনায় ফাইল সিস্টেমকে পুনরায় ট্র্যাভার করতে অনেক কম সিপিইউ সময় ব্যবহার করবে।

নমুনা আউটপুট:

...
            2429             76732484 /home/peter/weird-filenames/test/.hiddendir/foo bar
            2429             76732484 /home/peter/weird-filenames/test.orig/.hiddendir/foo bar

            2430             17961006 /usr/bin/pkg-config.real
            2430             17961006 /usr/bin/x86_64-pc-linux-gnu-pkg-config

            2430             36646920 /usr/lib/i386-linux-gnu/dri/i915_dri.so
            2430             36646920 /usr/lib/i386-linux-gnu/dri/i965_dri.so
            2430             36646920 /usr/lib/i386-linux-gnu/dri/nouveau_vieux_dri.so
            2430             36646920 /usr/lib/i386-linux-gnu/dri/r200_dri.so
            2430             36646920 /usr/lib/i386-linux-gnu/dri/radeon_dri.so
...

করণীয় ?: আন-প্যাড সঙ্গে আউটপুট awkবা cutuniqফিল্ড-সিলেকশন সমর্থন খুব সীমিত, তাই আমি ফলাফল আউটপুট প্যাড এবং স্থির-প্রস্থ ব্যবহার। 20chars সর্বাধিক সম্ভব ইনোড বা ডিভাইস নম্বর (2 ^ 64-1 = 18446744073709551615) জন্য যথেষ্ট প্রশস্ত। এক্সএফএস যে ডিস্কে তাদের বরাদ্দ করা হয়েছে তার ভিত্তিতে ইনোড নম্বরগুলি বেছে নেয় 0 থেকে স্বতঃস্ফূর্তভাবে নয়, তাই বড় এক্সএফএস ফাইল সিস্টেমগুলিতে> বিলিয়ন ফাইল না থাকলেও 32 বিট ইনড নম্বর থাকতে পারে। অন্যান্য ফাইল-সিস্টেমে 20-ডিজিটের ইনোড নম্বর থাকতে পারে যদিও তা বিশাল নয়।

টোডো: নথির দলকে পথ অনুসারে বাছাই করুন। এগুলিকে মাউন্ট পয়েন্ট অনুসারে বাছাই করার পরে ইনোড সংখ্যা জিনিসগুলিকে একসাথে মিশিয়ে দেয়, যদি আপনার কাছে বেশ কয়েকটি হার্ডলিঙ্ক রয়েছে এমন কয়েকটি আলাদা সাবডিয়ার থাকে। (অর্থাত্ দ্বি-গোষ্ঠীর গোষ্ঠীগুলি একসাথে যায় তবে আউটপুট তাদের মিশ্রিত করে)।

একটি ফাইনাল sort -k 3একক রেকর্ড হিসাবে লাইনগুলির গোষ্ঠী নয়, লাইনগুলি পৃথকভাবে সাজায়। এক জোড়া নিউলাইনগুলিকে একটি এনএল বাইটে রূপান্তর করতে কোনও sort --zero-terminated -k 3কিছুর আগে প্রসেস করা, এবং জিএনইউ ব্যবহার করা কৌশলটি করতে পারে। trযদিও 2-> 1 বা 1-> 2 নিদর্শন নয়, কেবল একক অক্ষরগুলিতে পরিচালনা করে। perlএটি করে (বা পার্স এবং পার্ক বা awk মধ্যে বাছাই)। sedকাজ করতে পারে।


1
%Dফাইল সিস্টেম শনাক্তকারী (কোনও ফাইল সিস্টেম umountএড না থাকা অবস্থায় এটি বর্তমান বুটের পক্ষে স্বতন্ত্র ), সুতরাং নিম্নলিখিতটি আরও জেনেরিক find directories.. -xdev ! -type d -links +1 -printf '%20i %20D %p\n' | sort -n | uniq -w 42 --all-repeated=separate। এটি যতক্ষণ কাজ করে না যতক্ষণ না প্রদত্ত ডিরেক্টরিতে ফাইল সিস্টেমের স্তরে আর একটি ডিরেক্টরি থাকে না, এটি হার্ডলিঙ্ক করা যায় এমন সব কিছুতেও নজর দেয় (যেমন ডিভাইস বা সফটলিঙ্কগুলি - হ্যাঁ, সফ্টলিঙ্কগুলির লিঙ্কের সংখ্যা 1 এর চেয়ে বেশি হতে পারে)। নোট করুন dev_tএবং ino_tআজ 64৪ বিট দীর্ঘ। আমাদের সম্ভবত 64৪ বিট সিস্টেম থাকা পর্যন্ত এটি সম্ভবত ধরে রাখবে।
টিনো

@ টিনো: ! -type dপরিবর্তে ব্যবহারের ক্ষেত্রে দুর্দান্ত পয়েন্ট -type f। এমনকি আমার কিছু ফাইল সংকলনের আয়োজন থেকে আমার ফাইল সিস্টেমে কিছু হার্ডলিঙ্কযুক্ত প্রতিলিপি রয়েছে। আপনার উন্নত সংস্করণ দিয়ে আমার উত্তর আপডেট করেছে (তবে আমি প্রথমে fs-id রেখেছি, তাই ফাইল সিস্টেমের মাধ্যমে কমপক্ষে গ্রুপগুলি সাজান))
পিটার কর্ডেস

3

এটি টোরোকোরো-মাচোর নিজস্ব উত্তর এবং স্ক্রিপ্টের কিছুটা মন্তব্য, তবে এটি অবশ্যই মন্তব্য বাক্সে খাপ খায় না।


তথ্যটি সন্ধান করার আরও সহজ উপায়গুলির সাথে আপনার স্ক্রিপ্টটি পুনরায় লিখুন এবং এইভাবে প্রক্রিয়াটির অনেক কম আবেদন।

#!/bin/sh
xPATH=$(readlink -f -- "${1}")
for xFILE in "${xPATH}"/*; do
    [ -d "${xFILE}" ] && continue
    [ ! -r "${xFILE}" ] && printf '"%s" is not readable.\n' "${xFILE}" 1>&2 && continue
    nLINKS=$(stat -c%h "${xFILE}")
    if [ ${nLINKS} -gt 1 ]; then
        iNODE=$(stat -c%i "${xFILE}")
        xDEVICE=$(stat -c%m "${xFILE}")
        printf '\nItem: %s[%d] = %s\n' "${xDEVICE}" "${iNODE}" "${xFILE}";
        find "${xDEVICE}" -inum ${iNODE} -not -path "${xFILE}" -printf '     -> %p\n' 2>/dev/null
    fi
done

আমি সহজে তুলনা করার জন্য এটি যতটা সম্ভব আপনার অনুরূপ রাখার চেষ্টা করেছি।

এই স্ক্রিপ্ট এবং আপনার মন্তব্য

  • $IFSযদি কোনও গ্লোবই যথেষ্ট হয় তবে যাদুটিকে এড়ানো উচিত , যেহেতু এটি অহেতুকভাবে সংশ্লেষিত হয় এবং ফাইলের নামগুলিতে আসলে নতুন লাইন থাকতে পারে (তবে বাস্তবে বেশিরভাগ ক্ষেত্রে প্রথম কারণ)।

  • lsযত তাড়াতাড়ি বা পরে আপনাকে কামড় দেবে আপনার পক্ষে ম্যানুয়ালি পার্সিং এবং এ জাতীয় আউটপুট যথাসম্ভব এড়ানো উচিত । উদাহরণস্বরূপ: আপনার প্রথম awkলাইনে আপনি সমস্ত ফাইলের নাম ফাঁকা করে ফেলবেন।

  • printf%sসিনট্যাক্সের সাথে এটি এতটাই দৃ is় হওয়ায় প্রায়শই শেষ পর্যন্ত ঝামেলা বাঁচায় । এটি আপনাকে আউটপুট উপর সম্পূর্ণ নিয়ন্ত্রণ দেয় এবং পৃথক পৃথক সমস্ত সিস্টেমে সামঞ্জস্যপূর্ণ echo

  • stat এক্ষেত্রে আপনাকে অনেক যুক্তি রক্ষা করতে পারে।

  • GNU find শক্তিশালী।

  • তোমার headএবং tailআমন্ত্রণ সরাসরি ঘাঁটা করা হয়ে থাকতে পারে awkযেমন সঙ্গে exitকমান্ড এবং / অথবা উপর নির্বাচন NRপরিবর্তনশীল। এটি প্রক্রিয়া আমন্ত্রণগুলি সংরক্ষণ করতে পারে, যা প্রায়শই কঠোর পরিশ্রমী স্ক্রিপ্টগুলিতে কার্য সম্পাদনকে তীব্রতর করে তোলে।

  • আপনার egrepগুলি ঠিক পাশাপাশি হতে পারে grep


xDEVICE = $ (stat -c% m "$ {xFILE ILE") সমস্ত সিস্টেমে কাজ করে না (উদাহরণস্বরূপ: স্ট্যাট (GNU কোর্টিলস) 6.12)। যদি স্ক্রিপ্টটি "আইটেম:?" প্রতিটি লাইনের সামনের অংশে, তারপরে এই আপত্তিকর লাইনটি মূল স্ক্রিপ্টের মতো আরও একটি লাইনের সাথে প্রতিস্থাপন করুন, তবে xITEM- এর সাথে নতুন নামকরণ করা হয়েছে xFILE: xDEVICE = $ (df "$ {xFILE}" | লেজ -1l | awk '{মুদ্রণ $ 6} ')
কুলগ্রিগেন

আপনি যদি প্রতিটি সদস্যকে "মাস্টার" হিসাবে পুনরাবৃত্তি না করে কেবল হার্ডলিঙ্কগুলির গোষ্ঠী চান তবে ব্যবহার করুন find ... -xdev -type f -links +1 -printf '%16i %p\n' | sort -n | uniq -w 16 --all-repeated=separate। এটি খুব দ্রুত, কারণ এটি কেবলমাত্র একবারে fs ট্র্যাভার করে। একসাথে একাধিক এফএসের জন্য আপনাকে একটি এফএস আইডি সহ ইনড নম্বরগুলি উপসর্গ করাতে হবে। হতে পারেfind -exec stat... -printf ...
পিটার কর্ডেস

সেই ধারণাকে একটি উত্তরে পরিণত করলেন
পিটার কর্ডেস

2

findhardlinksস্ক্রিপ্টের উপর ভিত্তি করে (এটির পুনরায় নামকরণ করা হয়েছে hard-links), এটিই আমি রিফ্যাক্টর করেছি এবং এটি কাজ করে চলেছি।

আউটপুট:

# ./hard-links /root

Item: /[10145] = /root/.profile
    -> /proc/907/sched
    -> /<some-where>/.profile

Item: /[10144] = /root/.tested
    -> /proc/907/limits
    -> /<some-where else>/.bashrc
    -> /root/.testlnk

Item: /[10144] = /root/.testlnk
    -> /proc/907/limits
    -> /<another-place else>/.bashrc
    -> /root/.tested

 

# cat ./hard-links
#!/bin/bash
oIFS="${IFS}"; IFS=$'\n';
xPATH="${1}";
xFILES="`ls -al ${xPATH}|egrep "^-"|awk '{print $9}'`";
for xFILE in ${xFILES[@]}; do
  xITEM="${xPATH}/${xFILE}";
  if [[ ! -r "${xITEM}" ]] ; then
    echo "Path: '${xITEM}' is not accessible! ";
  else
    nLINKS=$(ls -ld "${xITEM}" | awk '{print $2}')
    if [ ${nLINKS} -gt 1 ]; then
      iNODE=$(ls -id "${xITEM}" | awk '{print $1}' | head -1l)
      xDEVICE=$(df "${xITEM}" | tail -1l | awk '{print $6}')
      echo -e "\nItem: ${xDEVICE}[$iNODE] = ${xITEM}";
      find ${xDEVICE} -inum ${iNODE} 2>/dev/null|egrep -v "${xITEM}"|sed 's/^/   -> /';
    fi
  fi
done
IFS="${oIFS}"; echo "";

আমি পৃথক উত্তর হিসাবে এই স্ক্রিপ্টে মন্তব্য পোস্ট।
ড্যানিয়েল অ্যান্ডারসন

1

একটি জিইউআই সমাধান আপনার প্রশ্নের সাথে সত্যই কাছাকাছি আসে:

আপনি "এলএস" থেকে প্রকৃত হার্ডলিঙ্কযুক্ত ফাইলগুলি তালিকাবদ্ধ করতে পারবেন না কারণ পূর্ববর্তী মন্তব্যকারীরা উল্লেখ করেছেন যে "নাম" ফাইলটি একই তথ্যের নিছক উপমা। তবে, আসলে একটি জিইউআই সরঞ্জাম রয়েছে যা আপনি যা চান তার খুব কাছে চলে যায় যা লিনাক্সের অধীনে একই তথ্যের (হার্ডলিঙ্কগুলি) নির্দেশিত ফাইল নামের একটি পাথ তালিকা প্রদর্শন করা হয়, এটিকে এফএসলিন্ট বলা হয়। আপনি যে বিকল্পটি চান সেটি হ'ল "নাম সংঘর্ষ" -> অনুসন্ধান (এক্সএক্সএক্স) - "চেকবক্স $ पथ" নির্বাচন করুন এবং শীর্ষ-মধ্যের দিকে "জন্য ..." এর পরে ড্রপ-ডাউন বক্স থেকে "এলিয়াস" নির্বাচন করুন।

এফএসলিন্ট খুব খারাপভাবে নথিভুক্ত হয়েছে তবে আমি খুঁজে পেয়েছি যে "পুনরাবৃত্তি"? এবং পূর্বোক্ত বিকল্পগুলি, পাথ এবং নামগুলির সাথে হার্ডলিঙ্কযুক্ত ডেটার একটি তালিকা যা একই ডেটাতে "পয়েন্ট" প্রোগ্রাম অনুসন্ধানের পরে তৈরি করা হয়।



1

আপনি lsএকটি 'ওরফে' ব্যবহার করে হার্ডলিঙ্কগুলি হাইলাইট করার জন্য কনফিগার করতে পারেন , তবে হার্ডলিংকের 'উত্স' দেখানোর কোনও উপায় নেই বলে আগেই বলা হয়েছে যার কারণে আমি এটিতে .hardlinkসহায়তা করার জন্য যুক্ত করি।

হার্ডলিঙ্কগুলি হাইলাইট করুন

নিম্নলিখিত কোথাও আপনার যোগ করুন .bashrc

alias ll='LC_COLLATE=C LS_COLORS="$LS_COLORS:mh=1;37" ls -lA --si --group-directories-first'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.