2009-01-07 17 views
5

मैं सभी प्रतीकात्मक लिंक विशेषताओं (जैसे मालिक और अनुमतियों) को संरक्षित करते समय एक पर्ल प्रोग्राम में एक प्रतीकात्मक लिंक (और वह फ़ाइल जो इंगित करता है) की प्रतिलिपि कैसे बना सकता हूं?मैं पर्ल में प्रतीकात्मक लिंक कैसे कॉपी करूं?

धन्यवाद, splintor

उत्तर

8

पर्ल में आप readlink() फ़ंक्शन का उपयोग सिमलिंक गंतव्य पता लगाने के लिए कर सकते हैं।

आप सिमलिंक की अनुमतियों को पढ़ने के लिए lstat() फ़ंक्शन का भी उपयोग कर सकते हैं (stat() के विपरीत जो सिमलिंक द्वारा इंगित फ़ाइल के विवरण को पढ़ेगा)।

वास्तव में नए सिम्लिंक पर स्वामित्व को सेट करने के बिना अतिरिक्त सहायता के बिना नहीं किया जा सकता है क्योंकि पर्ल lchown() सिस्टम कॉल का पर्दाफाश नहीं करता है। इसके लिए आप सीपीएएन से पर्ल Lchown मॉड्यूल का उपयोग कर सकते हैं।

मान लिया जाये कि पर्याप्त अनुमतियाँ (nb: अनियंत्रित कोड)

use Lchown; 
my $old_link = 'path to the symlink'; 
my $new_link = 'path to the copy'; 

my $dst = readlink($old_link); 
my @stat = lstat($old_link); 

symlink $dst, $new_link; 
lchown $stat[4], $stat[5], $new_link; # set UID and GID from the lstat() results 

आप सिमलिंक पर अनुमतियों के बारे में चिंता करने की जरूरत नहीं है - वे हमेशा के रूप में -rwxrwxrwx

+0

धन्यवाद। मैंने नहीं देखा कि सिम्लिंक की कोई वास्तविक अनुमति नहीं है। मुझे यह सोचने की ज़रूरत है कि मालिक को बदलने में मुझे कितनी बुरी तरह की जरूरत है। – splintor

+0

यह भी ध्यान रखें कि यदि सिम्लिंक की सामग्री _relative_ पथ है तो उसे पुनर्लेखन की आवश्यकता हो सकती है यदि $ old_link और $ new_link एक ही निर्देशिका में नहीं हैं! – Alnitak

3

मॉड्यूल File::Copy::Recursive कि का ख्याल रखता है दिखाई देते हैं । डिफ़ॉल्ट रूप से यह सिम्लिंक कॉपी करेगा और स्वामित्व को संरक्षित करने का प्रयास करेगा।

+1

सूचक के लिए धन्यवाद। मेरे पास यह मेरे वितरण में नहीं है, और मुझे यह विचार करने की आवश्यकता है कि क्या मैं इस मॉड्यूल को जोड़ना चाहता हूं। मैं स्रोत में भी देखता हूं कि फ़ाइल के मालिक को संभाला नहीं जाता है। मुझे फिर से सोचना होगा कि यह मेरे लिए कितना महत्वपूर्ण है। – splintor

+0

मैं स्प्लिंटर से सहमत हूं - जबकि यह काम करता है, मॉड्यूल डिफ़ॉल्ट इंस्टॉल में नहीं है, इसलिए यदि आप अपने उपयोगकर्ताओं को निर्भरताओं को स्थापित करने की आवश्यकता से बचना चाहते हैं तो यह एक अच्छा समाधान नहीं होगा। – JosephH

संबंधित मुद्दे