2010-02-23 16 views
8

सर्वर फॉल्ट पर, How to list symbolic link chains? (मेरा प्रश्न नहीं) सभी प्रतीकात्मक लिंक सूचीबद्ध करने और उनका अनुसरण करने के बारे में बात करता है। इसे करने योग्य बनाने के लिए, पहले एक ही निर्देशिका पर विचार करें।मैं पर्ल हैश में फ़ाइल सिस्टम के प्रतीकात्मक लिंक का प्रतिनिधित्व कैसे कर सकता हूं?

मैं एक छोटी उपयोगिता लिखना चाहता हूं जो ऐसा करता है। जोड़ों को प्रतीकात्मक लिंक से हैश में रखना आसान लगता है और फिर हैश को संसाधित करना आसान लगता है।

लेकिन तब मैं हो सकता है कुछ की तरह:

ls -l 
total 0 
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b 
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c 
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:03 c -> a 
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 trap -> b 
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 x -> y 
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 y -> b 

जहां यह स्पष्ट है कि a->b->c एक पाश है, और एक पाश में है कि जाल अंक है, लेकिन एक पाश में x अंक पता करने के लिए मैं एक पालन करने की आवश्यकता बिट।

एक हैश प्रतिनिधित्व है:

a => b 
b => c 
c => a 
trap => b 
x => y 
y => b 

लेकिन एक बार मुझे पता है कि लूप बने हैं रिवर्स प्रतिनिधित्व बुरा प्रारंभिक बिंदु, के छोरों अंकन के लिए बेहतर है।

  • एक हैश सांकेतिक लिंक का प्रतिनिधित्व करने के लिए सबसे अच्छा संरचना है:

    तो यहाँ कुछ सवाल है?

  • फ़ाइल सिस्टम के ग्राफ को अलग करने का सबसे अच्छा तरीका क्या है कि पेड़ घटकों से लूप घटक को लूप प्रकार के टुकड़ों के साथ टिग में बताने के लिए?
  • क्या सभी शुरुआती बिंदुओं से सभी लूपों को मैन्युअल रूप से खोजने से बेहतर एल्गोरिदम है?
  • ग्राफ-सिद्धांत परिप्रेक्ष्य से - क्या इस तरह की चीज CPAN में पहले से ही है? यदि नहीं, तो कुछ अच्छे सहायक मॉड्यूल क्या हैं?
+0

समस्या को हल करने के लिए नमूना कोड जमा करना भी स्पष्ट रूप से प्रोत्साहित किया जाता है। – Paul

+0

हमें दिखा रहा है कि आपने अभी तक जो भी प्रयास किया है उसे भी प्रोत्साहित किया जाता है। :) –

+0

@brian दोह! मैंने इसे ज्यादातर किसी और की साफ समस्या के रूप में देखा, और कुछ नुकसान को पहचानने से परे इसे हल करने की कोशिश नहीं की। – Paul

उत्तर

7

CPAN पर एक Graph मॉड्यूल है कि आप निम्न में के रूप में उपयोग कर सकते हैं नहीं है: अपने प्रश्न में से एक के लिए संरचना में समान एक निर्देशिका में

#! /usr/bin/perl 

use warnings; 
use strict; 

use Graph; 

my $g = Graph->new; 
my $dir = @ARGV ? shift : "."; 

opendir my $dh, $dir or die "$0: opendir $dir: $!"; 
while (defined(my $name = readdir $dh)) { 
    my $path = $dir . "/" . $name; 

    if (-l $path) { 
    my $dest = readlink $path; 
    die "$0: readlink $path: $!" unless defined $dest; 

    $g->add_edge($name => $dest); 
    } 
    else { 
    $g->add_vertex($name); 
    } 
} 

my @cycle = $g->find_a_cycle; 
if (@cycle) { 
    $" = ' -> '; #" # highlighting error 
    print "$0: $dir: at least one cycle: @cycle\n"; 
} 
else { 
    print "$0: $dir: no cycles\n"; 
} 

उदाहरण के लिए, उत्पादन

$ ../has-cycle 
../has-cycle: .: at least one cycle: c -> a -> b
है
+0

इसे पोस्ट करने के लिए धन्यवाद। मैं अपने पास कुछ अन्य जरूरतों के लिए ग्राफ को देखना चाहता हूं, और इस तरह की चीजों पर ब्रश करना चाहता हूं। – Paul

+0

@ पॉल आपका स्वागत है! मुझे खुशी है कि आपको यह फायदेमंद लगता है। –

2

सीपीएएन मॉड्यूल File::Spec::Link पर एक नज़र डालें। हल करने की विधि कहती है कि यह लिंक किए गए लक्ष्य को खोजने के लिए बार-बार एक लिंक को पार करता है।

संकल्प ($ लिंक)
    रिटर्न गैर लिंक अंततः से जुड़ा हुआ $ लिंक, के द्वारा बार-बार जुड़ा हुआ कॉलिंग:

मॉड्यूल के संकल्प विधि इस में क्या कहना है। अगर लिंक को हल नहीं किया जा सकता है तो

मैंने इस मॉड्यूल का उपयोग प्रतीकात्मक लिंक का लक्ष्य खोजने के लिए किया था जिसका लक्ष्य एक सिम्लिंक और इसी तरह चालू था। लेकिन मुझे यकीन नहीं है कि यह चक्रीय प्रतीकात्मक लिंक का पता लगाता है।

-1

आपको केवल लिंक के नाम से अधिक स्टोर करने की आवश्यकता है। या तो इनोड नंबर को पकड़ें (यदि आपका एफएस इसका समर्थन करता है) या कुछ अन्य अद्वितीय पहलू।यदि कोई अस्तित्व में नहीं है, तो अपना नाम बनाने/विचार/आखिरी संशोधित तारीख को चेकसमिंग करके अपना खुद का निर्माण करने पर विचार करें। किसी भी तरह से, आपको प्रत्येक लिंक को विशिष्ट रूप से पहचानने के लिए कुछ तरीका चाहिए। मैंने कुछ उपयोगिताएं देखी हैं जो केवल लिंक की संख्या (8 और 255 के बीच) पर एक सीमा डालती हैं और इस सीमा को पार करने वाली किसी भी चीज़ को घोषित करती हैं, लेकिन मैंने हमेशा यह माना कि "सस्ता रास्ता निकालना" के रूप में। :)