আমি একটি ফাইল সিস্টেমে সমস্ত হার্ডলিঙ্কযুক্ত ফাইলগুলি কীভাবে খুঁজে পেতে পারি?


21

আমাকে একটি নির্দিষ্ট ফাইল সিস্টেমে সমস্ত হার্ডলিঙ্কযুক্ত ফাইলগুলি সন্ধান করতে হবে। যেমন ফাইলগুলির একটি তালিকা পান, প্রতিটি লাইনে সংযুক্ত জোড়া বা ট্রিপল ইত্যাদি থাকে ts

আমি কীভাবে এটি করব তা কমবেশি বুঝতে পেরেছি, একটি ফাইল সিস্টেমে সমস্ত ফাইল / ডিরেক্টরিতে ইনড দ্বারা একটি অভিধান তৈরি করা দরকার, "বাদ দিন lude" এবং ".." লিঙ্কগুলি, এবং তারপরে একাধিক নামের সাথে ইনডোডগুলি হার্ডলিঙ্কস ... তবে আমি আশা করি যে সম্ভবত একটি প্রস্তুত সমাধান রয়েছে, বা ইতিমধ্যে কেউ এ জাতীয় স্ক্রিপ্ট লিখেছেন।

উত্তর:


17

আপনি নিম্নলিখিত কমান্ড চালাতে পারেন:

find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'

সমস্ত হার্ড-লিঙ্কযুক্ত ফাইলগুলি সন্ধান করতে।

বা @ এমবাফোর্ড সংস্করণ:

find / -type f -links +1 -printf '%i %n %p\n'

1
ধন্যবাদ, এটি আমি যা চেয়েছিলাম ঠিক তা নয়, তবে যথেষ্ট কাছে। আমি
ইনোড

15
অনুসন্ধানের "-লিঙ্কস + এন 'সিনট্যাক্স ব্যবহার করে আপনি জোরদার প্রয়োজন এড়াতে পারেন eg উদাহরণস্বরূপ কমপক্ষে দুটি লিঙ্কযুক্ত সমস্ত ফাইল সন্ধান এবং প্রয়োজনীয় তথ্য মুদ্রণ করতে:find / -type f -links +1 -printf '%i %n %p\n'
এমবাফোর্ড

sort(+ uniq) দিয়ে পাইপিং সম্পর্কে কীভাবে ? আমি কৌতূহলী ছিলাম তাই এটি আমার প্রধান কম্পিউটারে (16 গিগাবাইট আই 5-2500 কে এসএসডি সহ) যেতে পেল। 2187757 ফাইল সহ ( find / -xdev -type f | wc) 3820 ফাইল / 570 ইনোডগুলি ( ) ফেরত দেওয়ার সময় 12 রিয়েল সেকেন্ড নেয় time sudo find / -xdev -type f -links +1 -printf "%i\n" | sort | uniq | wc। আপনাকে %n %pআসল ফাইলগুলির জন্য অন্তর্ভুক্ত করতে হবে যেহেতু আমি এনেডগুলি গণনা করার জন্য এগুলি বের করেছিলাম।
উত্তর-ব্র্যাডলি

17
find . -type f -links +1 2>/dev/null

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

for i in $(find . -type f -links +1 2>/dev/null); do find -samefile $i | awk '{printf "%s ", $1}'; printf "\n"; done | sort | uniq

কিন্তু আমি আন্তরিকভাবে আশা করি প্রথম লেট করে উদাহরণস্বরূপ, ভালো সমাধান আছে findকল মুদ্রণ inode সংখ্যার এবং তারপর ব্যবহার findএর -inumবিকল্পটি এই inode সঙ্গে যুক্ত সব ফাইল দেখানোর জন্য।


1
সেকি! এটি প্রতিটি হার্ডলিঙ্কযুক্ত ফাইলের জন্য ফাইল সিস্টেমটি বারবার স্ক্যান করে ...
হ্যামগ

1
আমি দাবি করিনি এটি দ্রুত ছিল - এবং এটি ছোট ডিরেক্টরি গাছগুলির জন্য কাজ করে। অবশ্যই, একটি যথাযথ সূচক, যা থেকে তৈরি করা যেতে পারে, উদাহরণস্বরূপ, আউটপুট find . -type f -printf '%i %p\n', একজনকে আরও দ্রুত সমাধান তৈরি করতে দেয়।
ক্লোডিয়াস

এবং এটি AFAIK পথে স্থান পরিচালনা করে না।
গিলস কুইনট

জন্য forলুপ, সামঞ্জস্য IFS তদনুসারে কাজ করবে। আমার মন্তব্যে ফাইন্ড কমান্ডের আউটপুট পার্স করার জন্য, প্রথম স্থান এবং লাইনের শেষের মধ্যে সমস্ত কিছুকে ফাইলের নাম হিসাবে ঘোষণা করে কাজ করা উচিত।
ক্লোডিয়াস

1
@ সতী: এটি নিশ্চিত করে যে ত্রুটি বার্তাগুলি বাতিল করা হয়েছে (যেমন ফোল্ডারের জন্য আপনার পছন্দ মতো অ্যাক্সেস নেই lost+foundইত্যাদি); যা বিশেষত গুরুত্বপূর্ণ, যদি আউটপুটটি দ্বিতীয় লাইনের মতো আরও প্রক্রিয়া করা উচিত।
ডিজে ক্র্যাশডমি 18

1

আইএমএইচও সর্বোত্তম উপায় হ'ল নিম্নলিখিত লাইনটি ব্যবহার করা (নিশ্চিতভাবেই আপনি /PATH/FOR/SEARCH/যা যা অনুসন্ধান করতে চান তার সাথে আপনাকে প্রতিস্থাপন করতে হবে):

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' | fgrep -f <(find . -xdev -printf '%i\n' | sort -n | uniq -d) | sort -n

এটি কেবল একবারে ফাইল সিস্টেমটি স্ক্যান করে, একাধিক হার্ডলিংকের সাহায্যে ইনড, হার্ডলিঙ্কের সংখ্যা এবং ফাইলগুলির পথ দেখায় এবং ইনোড অনুসারে এগুলি সাজায়।

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

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' 2> /dev/null | fgrep -f <(find . -xdev -printf '%i\n' 2> /dev/null | sort -n | uniq -d) | sort -n
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.