मैं दृढ़ता से सुझाव देना चाहता हूं कि कार्य के लिए उपयोग न करें find -L
(स्पष्टीकरण के लिए नीचे देखें)। ऐसा करने के कुछ अन्य तरीके यहां दिए गए हैं:
यदि आप "शुद्ध find
" विधि का उपयोग करना चाहते हैं , तो इसे इस तरह दिखना चाहिए:
find . -xtype l
( xtype
एक परीक्षण किया गया लिंक पर प्रदर्शन किया जाता है) यह सभी संस्करणों में उपलब्ध नहीं हो सकता है find
, हालाँकि। लेकिन अन्य विकल्प भी हैं:
आप कमांड के test -e
भीतर से भी निष्पादित कर सकते हैं find
:
find . -type l ! -exec test -e {} \; -print
यहां तक कि कुछ grep
ट्रिक (यानी, सुरक्षित ) की तुलना में बेहतर हो सकती हैं find -L
, लेकिन बिल्कुल नहीं जैसे कि प्रश्न में प्रस्तुत किया गया है (जो पूरे आउटपुट लाइनों में शामिल है, जिसमें फ़ाइल नाम भी शामिल है):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
find -L
चाल उद्धृत एकल द्वारा से commandlinefu अच्छा और hacky लग रहा है, लेकिन यह एक बहुत है खतरनाक ख़तरा : सभी सिमलिंक पीछा कर रहे हैं। नीचे प्रस्तुत सामग्री के साथ निर्देशिका पर विचार करें:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
यदि आप find -L . -type l
उस निर्देशिका में चलते हैं , तो सभी /usr/share/
को खोजा जाएगा (और यह वास्तव में लंबा समय ले सकता है) 1 । एक find
कमांड के लिए जो "आउटगोइंग लिंक के लिए प्रतिरक्षा है", का उपयोग न करें-L
।
1 यह एक छोटी सी असुविधा की तरह लग सकता है (कमांड "बस" लंबे समय तक सभी को पार करने में लगेगा /usr/share
) - लेकिन अधिक गंभीर परिणाम हो सकते हैं। उदाहरण के लिए, चेरोट वातावरण पर विचार करें: वे मुख्य फाइलसिस्टम के कुछ उपनिर्देशिका में मौजूद हो सकते हैं और पूर्ण स्थानों के लिए सीमलिंक शामिल कर सकते हैं। उन लिंक को "बाहर" सिस्टम के लिए तोड़ा जा सकता है, क्योंकि वे केवल एक बार उचित स्थानों की ओर इशारा करते हैं जब आप चुरोट में प्रवेश करते हैं। मुझे यह भी याद है कि कुछ बूटलोडर ने सिर्लिंक का इस्तेमाल किया था, /boot
जो कि शुरुआती बूट फेज़ में ही समझ में आता था, जब बूट पार्टीशन को माउंट किया गया था /
।
इसलिए यदि आप find -L
खोजने के लिए एक कमांड का उपयोग करते हैं और फिर कुछ हानिरहित दिखने वाली निर्देशिका से टूटे हुए सीमलिंक को हटाते हैं, तो आप अपने सिस्टम को भी तोड़ सकते हैं ...
-type l
है कि गैर-लिंक के-xtype l
रूप में काम करेंगे के बाद से अनावश्यक है-type l
। तोfind -xtype l
शायद आप सभी की जरूरत है। इस दृष्टिकोण के लिए धन्यवाद।