मैं किसी फ़ाइल को उसके नाम और आंशिक पथ से कैसे खोज सकता हूँ?


64

अक्सर मेरे पास फ़ाइल नाम होता है और यह आंशिक पथ होता है, जैसे "सामग्री / डॉक्स / file.xml"।

क्या अलग से मैन्युअल रूप से निर्देशिका नाम और फ़ाइल नाम प्रदान करने के लिए उसके नाम को काटे बिना उस फ़ाइल को खोजने का एक सरल तरीका है?

यह बहुत अच्छा होगा अगर findउस तरह से काम किया जाए, तो मैं दौड़ सकता हूं find content/docs/file.xml, लेकिन दुर्भाग्य से ऐसा नहीं है।


1
आप शुरुआत में एक * वाइल्डकार्ड जोड़ने की कोशिश कर सकते हैं। find -path *content/docs/file.xmlमेरे लिए काम किया।
बॉब

धन्यवाद, @ याकूब, यह वास्तव में मेरे लिए काम कर रहा है। Btw, दिलचस्प है, कि अगर मैं तारांकन के बाद एक स्लैश जोड़ रहा हूँ: "-path * / content / docs / file.xml", यह काम नहीं करता है। वैसे भी बहुत धन्यवाद।

इसके अलावा, @ याकूब, कृपया इसे एक उत्तर के रूप में बनाएं और मैं इसे एक सही के रूप में चिह्नित करूंगा।

तारांकन के बाद काम न करने का कारण शायद यह है कि तारांकन से बच जाना चाहिए था, मेरे जवाब को संपादित देखें।
बॉब

जवाबों:


72

किसी भी चीज़ के* लिए मैच इंगित करने के लिए वाइल्डकार्ड में पास करें । तुम भी भागने की जरूरत है , उदाहरण के लिए:*

find . -path \*content/docs/file.xml

या उद्धरण में पैटर्न संलग्न करें, जैसे:

find . -path "*content/docs/file.xml"

जैसा कि मैन पेज इसका वर्णन करता है:

$ मिल गया। -नाम * .सी -प्रिंट

खोजें: रास्तों को अभिव्यक्ति से पहले होना चाहिए

ऐसा इसलिए होता है क्योंकि * .c को शेल द्वारा विस्तारित किया गया है जिसके परिणामस्वरूप वास्तव में इस तरह एक कमांड लाइन प्राप्त होती है:

खोजो। -name bigram.c code.c frcode.c find.c -print

यह आदेश निश्चित रूप से काम नहीं करने वाला है। इस तरह से चीजें करने के बजाय, आपको पैटर्न को उद्धरण में संलग्न करना चाहिए या वाइल्ड कार्ड से बचना चाहिए:

$ मिल गया। -name \ *। c -print


10

खोज में एक -wholename विकल्प भी है find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword

मैं पूरा रास्ता नहीं जानता, केवल आंशिक है, इसलिए "-होलेननेम" काम नहीं करेगा।

ध्वज भ्रामक है, मेरा उदाहरण देखें ... यह आपको स्ट्रिंग को एक निर्देशिका में विस्तारित करने देता है यदि आप इसे जानते हैं
Technosaurus

3
find . -type f | grep "content/docs/file.xml"

या केवल

locate content/docs/file.xml

पता लगाना एक दिलचस्प विकल्प है, लेकिन यह पूरी डिस्क को खोजता है, मैं आधार खोज निर्देशिका को निर्दिष्ट करने की क्षमता या कम से कम परम का उपयोग करने के लिए निर्दिष्ट करना चाहूंगा, इस खोज को इस निर्देशिका से बनाया जाना चाहिए (जैसे आपका पहला विकल्प) , जड़ से नहीं।

1
@ user69817 - इसके विपरीत, डिस्क की खोज न करें, यह एक खोज डेटाबेस से पूछताछ करता है, जो आम तौर पर दिन में एक बार क्रोन के माध्यम से आबाद हो जाता है।
tink

1

उदाहरण के लिए तारांकन चिह्न / वाइल्डकार्ड ( *) का उपयोग करके किसी स्थान में फ़ाइलें खोजना : जैसा कि dir=“/apps/*/instance01/" आप पा सकते हैं ${dir} -name “*.jks”। सभी फाइलों को इस तरह से एक सरणी में रखना:

arr=(`find ${dir} -name “*.jks"`)

यदि आप अन्य एक्सटेंशन वाली फ़ाइलों को प्राप्त करना चाहते हैं तो 'या' का उपयोग करें:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" क्योंकि -nameकेवल एकल स्ट्रिंग को स्वीकार करता है इसलिए 'या' का उपयोग करें।

अंत में इस तरह से सब कुछ डाल दिया:

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

यदि आपके पास पूर्ण पथ हैं, तो आंशिक पथ नहीं हैं, उन्हें इस तरह से सरणियों में रखना आसान है:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.