2010-08-08 17 views
9

मैं गिट में अपनी सभी प्रोफाइल कॉन्फ़िगरेशन फ़ाइलों (~/.xxx) को स्टोर करने का प्रयास कर रहा हूं। मैं बैश स्क्रिप्टिंग में बहुत भयानक हूं लेकिन मुझे लगता है कि यह आपके लिए स्क्रिप्टिंग गुरुओं के लिए बहुत सीधे आगे होगा।बैश स्क्रिप्ट सुरक्षित रूप से सिम्लिंक बनाने के लिए?

असल में, मुझे एक ऐसी स्क्रिप्ट चाहिए जो मेरे रेपो में फ़ाइलों को मेरी होम निर्देशिका में प्रतीकात्मक लिंक बनाएगी। ट्विस्ट है, अगर मैं सिमलिंक एक वास्तविक फ़ाइल को ओवरराइट कर रहा हूं तो मैं इसे ओवरराइट करने के लिए चेतावनी दूंगा और संकेत दूंगा। यह भी संकेत देना चाहिए कि एक sym लिंक ओवरराइट होने जा रहा है, लेकिन लक्ष्य पथ अलग है।

मुझे प्रत्येक लिंक के लिए स्क्रिप्ट को मैन्युअल रूप से संपादित करने में कोई फर्क नहीं पड़ता। मैं अपने रेपो में संग्रहीत इस स्क्रिप्ट को चलाकर नई कॉन्फ़िगर स्क्रिप्ट को त्वरित रूप से तैनात करने में सक्षम होने के बारे में अधिक चिंतित हूं।

कोई विचार?

उत्तर

14

ln आदेश पहले से ही मिटा के बारे में रूढ़िवादी है, इसलिए हो सकता है KISS दृष्टिकोण आपके लिए भी अच्छा है:

ln -s git-stuff/home/.[!.]* . 

एक फ़ाइल या लिंक को पहले से ही मौजूद है, तो आपको एक त्रुटि संदेश मिल जाएगा और इस लिंक होगा छोड़ा जाना

ln -sn git-stuff/home/profile .profile 
... 

हैं:

आप अपने भंडार में एक अलग नाम है करने के लिए फ़ाइलों को चाहते हैं, इतना है कि यह गलती से उस नाम के एक मौजूदा उप-निर्देशिका के एक सिमलिंक का निर्माण नहीं करता ln को -n विकल्प पारित आप अपनी होम निर्देशिका की उप-निर्देशिकाओं में भी लिंक रखना चाहते हैं, cp -as निर्देशिका संरचना को पुन: उत्पन्न करता है लेकिन नियमित फ़ाइलों के लिए प्रतीकात्मक लिंक बनाता है। -i विकल्प के साथ, यह संकेत देता है कि कोई लक्ष्य पहले से मौजूद है या नहीं।

cp -i -as git-stuff/home/.[!.]* . 

(मेरा जवाब जीएनयू ln और GNU cp, इस तरह के रूप में आप लिनक्स (और Cygwin पर पाते हैं) लेकिन आम तौर पर नहीं पर अन्य unices मान लिया गया है।)

+1

सीपी-एस के लिए +1, मुझे नहीं पता था कि अस्तित्व में था! आरटीएफएम सही है? – Mosby

1

निम्नलिखित दौड़ की स्थिति है, लेकिन यह है संभवतया सुरक्षित है क्योंकि आप फाइल सिस्टम लेन-देन के बिना प्राप्त कर सकते हैं:

# create a symlink at $dest pointing to $source 
# not well tested 
set -e # abort on errors 
if [[ (-h $dest && $(readlink -n "$dest") != $source) || -f $dest || -d $dest ]] 
then 
    read -p "Overwrite $dest? " answer 
else 
    answer=y 
fi 
[[ $answer == y ]] && ln -s -n -f -v -- "$source" "$dest"