सहिष्णु पथ पर काम नहीं करता है?


15

अगर मैं इस कमांड को चलाता हूं तो find $HOME/MySymlinkedPath -name "run*.sh"कुछ भी नहीं होता है, और कोई त्रुटि नहीं देता है ('MySymlinkedPath' एक अन्य हार्ड ड्राइव के लिए एक सिमिलिंक किया गया रास्ता है, फिर मेरा $ HOME एक)।

ये भी विफल:

find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"

और बस यह सुनिश्चित करने के लिए, यह गैर-मौजूद पथ विफल रहता है (निश्चित रूप से) find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"इसलिए पथ पाया जा रहा है (क्योंकि वह त्रुटि नहीं होती है), लेकिन findइस पर खोज नहीं करता है, और मैं अब बहुत कुछ नहीं जानता हूं।

यह केवल तभी काम करता है जब मैं cd $HOME/MySymlinkedPathपहली बार इस तरह से पथ संदर्भ को हटाता हूं find -name "run*.sh"लेकिन यह मेरी स्क्रिप्ट के लिए अच्छा नहीं है।

एक अतिरिक्त जानकारी :
यह कमांड हमेशा की तरह काम करता है ls $HOME/MySymlinkedPath/run*.sh, और अगर मैं वहां जाता हूं cd $HOME/MySymlinkedPathऔर इसे चलाता हूं तो ls ..परिणाम वह नहीं है जो मैं उम्मीद कर रहा था - उस पथ की सूची जहां सहानुभूति पथ स्थित है - यह वास्तविक पथ की सूची लौटाता है एक और मीडिया / हार्डड्राइव !!!

pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath

फिर से सोच :
क्या यह findऔर lsमेरे सिस्टम के साथ एक समस्या है? या यह अपेक्षित है और समस्या नहीं है ?? मैं उबंटू 12.10 पर हूं। यह मेरे द्वारा परीक्षण किए गए सभी टर्मिनलों पर विफल रहता है, इसलिए टर्मिनल "समस्या" नहीं लगती है।


1
मुझे एक बेहतर उत्तर मिला "फाइंड -फॉलो"। stackoverflow.com/questions/105212/…
जारोद

@ जारोड मैन पेज कहता है -फाल अपवित्री है और हमें नीचे दिए गए मेरे उत्तर के अनुसार -L का उपयोग करना चाहिए (वह भी --follow):
कुंभ राशि

जवाबों:


20

यहाँ जवाब है। लेकिन यह सवाल समस्या के लक्ष्य के रूप में टकराता है।

व्याख्या यह है कि findपाता है "$HOME/MySymlinkedPath"। यह एक प्रतीकात्मक कड़ी है, निर्देशिका नहीं है, इसलिए पुनरावर्ती वंश वहां रुक जाता है। यदि अभिव्यक्ति मेल खाती है "$HOME/MySymlinkedPath"(उदाहरण के लिए find "$HOME/MySymlinkedPath" -name 'My*', तो), तो findवह एक मैच के रूप में प्रिंट करेगा।

जैसा कि वहां बताया गया है, मैंने पाया कि इससे निपटने और सभी लिपियों को ठीक करने का सबसे आसान / साफ तरीका है, बजाय:

find "$HOME/MySymlinkedPath" -name "run*.sh"

बस एक स्लैश जोड़ें, ताकि findप्रतीकात्मक लिंक से नहीं बल्कि प्रतीकात्मक लिंक के लक्ष्य से शुरू हो:

find "$HOME/MySymlinkedPath/" -name "run*.sh"

वैकल्पिक रूप से, पास करें -H विकल्प कोfind (ध्यान दें कि यह पहले आना चाहिए, रास्तों से पहले) इसे अपने कमांड लाइन पर पारित प्रतीकात्मक लिंक को बताने के लिए। (यह अलग है -Lजो findपुनरावर्ती वंश के दौरान सामने आए प्रतीकात्मक लिंक को बताता है।)

find -H "$HOME/MySymlinkedPath" -name "run*.sh"

और अंत में यहां सबसे अच्छा काम किया -L(कई फाइल सिस्टम के कारण मेरे पास फ़ोल्डर्स के सहानुभूति है)। लेकिन यह गैर समस्याग्रस्त त्रुटि संदेशों का भार उत्पन्न करता है इसलिए मैंने जोड़ा 2>/dev/null; और इस उपनाम को बनाने का भी निर्णय लिया alias find='find -L':

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null

2
IMHO, यह आमतौर पर निर्देशिकाओं के बाद अनुगामी स्लैश का उपयोग करने के लिए अच्छा अभ्यास है ताकि यह इंगित किया जा सके कि वे वास्तव में निर्देशिका हैं। :) बातें अधिक पठनीय बनाता है, आदि
dannysauer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.