2011-11-08 20 views
35

मैं find चलाता हूं और कुछ प्रतीकात्मक लिंक एकत्र करने के लिए [ \(-L $F \) ] के साथ परिणामों के माध्यम से पुन: प्रयास करता हूं।मैं कैसे पता लगा सकता हूं कि बैश में एक सिम्लिंक टूट गया है या नहीं?

मुझे आश्चर्य है कि इस परिदृश्य में लिंक टूटा हुआ है (एक गैर-मौजूद फ़ाइल को इंगित करता है) यह निर्धारित करने का एक आसान तरीका है।

यहाँ मेरी कोड है:

FILES=`find /target/ | grep -v '\.disabled$' | sort` 

for F in $FILES; do 
    if [ -L $F ]; then 
     DO THINGS 
    fi 
done 

उत्तर

39
# test if file exists (test actual file, not symbolic link) 
if [ ! -e "$F" ] ; then 
    # code if the symlink is broken 
fi 
+0

ध्यान दें कि अगर फ़ाइल मौजूद नहीं है तो कोड भी निष्पादित किया जाएगा। यह 'ढूंढ' के साथ ठीक है लेकिन अन्य परिस्थितियों में (जैसे ग्लब्स) को इस मामले को संभालने के लिए जोड़ा जाना चाहिए, उदाहरण के लिए '[-h "$ F" -a! -e "$ एफ"] '। – Calimo

+0

आप वास्तव में इस दृष्टिकोण के साथ प्रतीकात्मक लिंक का परीक्षण नहीं कर रहे हैं। –

+0

@ कैलिमो कोई फर्क नहीं पड़ता। – Melab

7

readlink -q चुपचाप असफल हो जायेगी अगर लिंक बुरा है:

for F in $FILES; do 
    if [ -L $F ]; then 
     if readlink -q $F >/dev/null ; then 
      DO THINGS 
     else 
      echo "$F: bad link" >/dev/stderr 
     fi 
    fi 
done 
+0

यह बहुत अच्छा लगता है क्योंकि यह फ़ाइल वास्तव में एक सिमलिंक है तो यह केवल सच हो जाती है। लेकिन -q जोड़ने के साथ भी, रीडलिंक लिनक्स पर लिंक का नाम आउटपुट करता है। यदि सामान्य रूप से यह मामला शायद 'readlink -q $ F> dev/null' के साथ अद्यतन किया जाना चाहिए। या क्या मैं कुछ न कुछ भूल रहा हूं? – zoltanctoth

+1

नहीं, आप सही हैं। ठीक है, धन्यवाद। –

+0

कौन सा संस्करण? मुझे अपने सिस्टम पर यह व्यवहार नहीं दिख रहा है रीडलिंक - संस्करण रीडलिंक (कोर्यूटिल्स) 5.2.1 –

26

इससे ज़्यादा लिंक टूट रहे हैं प्रिंट आउट करना चाहिए:

find /target/dir -type l ! -exec test -e {} \; -print 

आप भी इसमें श्रृंखला कर सकते हैं ऑपरेशन find कमांड, उदा।

find /target/dir -type l ! -exec test -e {} \; -exec rm {} \; 
2

आप गैर टूट dir सिमलिंक traversing कोई आपत्ति नहीं है, सभी अनाथ लिंक खोजने के लिए: टूटा हुआ लिंक को हटाने

 
$ find -L /target -type l | while read -r file; do echo $file is orphaned; done 

सभी फ़ाइलें लिंक अनाथ नहीं कर रहे हैं खोजने के लिए:

 
$ find -L /target ! -type l 
+1

लेकिन यह निर्देशिकाओं के लिए गैर-टूटी सिम्लिंक का पालन करता है, जिसे हम नहीं चाहते हैं। – rafak

5

इस करता है, तो सिमलिंक एक फ़ाइल या एक निर्देशिका की ओर इशारा करते था काम करेंगे, लेकिन अब

टूट गया है
2

यह "लिंक" प्रकार की सभी फाइलें पाता है, जो एक प्रकार "लिंक" का भी हल करता है। अर्थात। एक टूटा हुआ सिम्लिंक

find /target -type l -xtype l 
+1

संस्करण: 'find -L/target -type l' – cdelacroix

+0

क्या आपके पास एक सिम्लिंक को सिमलिंक नहीं है जो टूटा नहीं है?' –

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

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