मैं एक फाइलसिस्टम पर सभी हार्डलिंक फाइलें कैसे पा सकता हूं?


21

मुझे दिए गए फाइल सिस्टम पर सभी हार्डलिंक फाइल्स को खोजने की जरूरत है। जैसे फाइलों की एक सूची मिलती है, प्रत्येक पंक्ति में लिंक किए गए जोड़े, या ट्रिपल आदि होते हैं।

मुझे कमोबेश यह समझ में आता है कि यह कैसे करना है, किसी को एक फाइल सिस्टम पर सभी फाइलों / निर्देशिकाओं के लिए इनकोड द्वारा शब्दकोष बनाने की जरूरत है, ""। और ".." लिंक, और फिर एक से अधिक नामों वाले इंडोड्स हार्डलिंक हैं ... लेकिन मुझे आशा है कि शायद एक तैयार समाधान मौजूद है, या किसी ने पहले से ही इस तरह की स्क्रिप्ट लिखी है।

जवाबों:


17

आप निम्न आदेश चला सकते हैं:

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

सभी हार्ड-लिंक फ़ाइलों को खोजने के लिए।

या @mbafford संस्करण:

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

1
धन्यवाद, यह बिल्कुल वैसा नहीं है जैसा मैं चाहता था, बल्कि काफी करीब भी था। मैं
इनकोड

15
आप खोज के "-लिंक्स + एन 'सिंटैक्स का उपयोग करके जागने की आवश्यकता से बच सकते हैं। उदाहरण के लिए कम से कम दो लिंक वाली सभी फ़ाइलों को खोजने और आवश्यक जानकारी का प्रिंट आउट करने के लिए:find / -type f -links +1 -printf '%i %n %p\n'
mbafford

कैसे sort(+ uniq) के माध्यम से पाइपिंग के बारे में ? मैं उत्सुक था इसलिए इसे अपने मुख्य कंप्यूटर (ssd के साथ 16GB i5-2500k) पर जाने दिया। 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कॉल प्रिंट आईनोड संख्या और उसके बाद का उपयोग कर findके -inumविकल्प इस नोड के साथ जुड़े सभी फाइलों को दिखाने के लिए।


1
आउच! यह प्रत्येक
हार्डलिंक

1
मैंने दावा नहीं किया कि यह तेज़ था - और यह छोटे निर्देशिका के पेड़ों के लिए काम करता है। बेशक, एक उचित इंडेक्स, जिसका निर्माण किया जा सकता है, उदाहरण के लिए, का आउटपुट find . -type f -printf '%i %p\n', एक को बहुत तेज़ समाधान बनाने की अनुमति देगा।
क्लोडिअस

और जो AFAIK पथ में स्थान नहीं संभालता है।
गाइल्स क्वेनोट

के लिए forपाश, का समायोजन आईएफएस तदनुसार काम करेगा। मेरी टिप्पणी में खोज कमांड के आउटपुट को पार्स करने के लिए, पहली जगह और लाइन के अंत के बीच सब कुछ घोषित करना चाहिए फ़ाइल नाम काम करना चाहिए।
क्लॉडियस

1
@ सती: यह सुनिश्चित करता है कि त्रुटि संदेश छोड़ दिए जाएं (जैसे उन फ़ोल्डरों के लिए जिन्हें आपने पसंद नहीं किया है lost+foundआदि); जो विशेष रूप से महत्वपूर्ण है, अगर आउटपुट को दूसरी पंक्ति की तरह आगे संसाधित किया जाना चाहिए।
डीजेक्रश्मी

1

IMHO का सबसे अच्छा तरीका निम्न लाइन का उपयोग करना है (निश्चित रूप से आपको /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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.