उपनिर्देशिका में पुनरावर्ती फ़ाइलों की खोज कैसे करें

मैं सभी की तलाश में हूं XML एक विशेष निर्देशिका में फ़ाइलें और इसके अंदर सभी उप-निर्देशिकाएं (पुनरावर्ती) ।

ls -R *.xml केवल वर्तमान निर्देशिका में फ़ाइलों को सूचीबद्ध कर रहा है । मुझे पूरा यकीन है, उप-फ़ोल्डरों में स्वयं कई हैं .xml फाइलें, लेकिन कोई भी दिखाई नहीं दे रहा है ।

क्या यह कॉन्फ़िगरेशन समस्या है?

आप इसके साथ कर सकते हैं खोजें केवल:

find . -name '*.xml'

. वर्तमान निर्देशिका है । यदि आपको किसी अन्य निर्देशिका में खोज करने की आवश्यकता है, तो प्रतिस्थापित करें . निर्देशिका पथ के साथ ।

उपयोग करने का प्रयास करें खोजें

sudo find . -print | grep -i '.*[.]xml'

इस आदेश का प्रयास करें:

ls -R | grep '.*[.]xml'

ls आउटपुट को फ़िल्टर करने के विकल्प नहीं हैं । इसके लिए आपको पाइप का इस्तेमाल करना होगा । यह आउटपुट से गुजरता है ls को grep, जो तब उन्हें सिर्फ दिखाने के लिए फ़िल्टर करता है .xml फ़ाइलें।

बैश

का उपयोग करना globstar शेल विकल्प, हम पुनरावर्ती ग्लोबिंग का उपयोग कर सकते हैं ./**/*

bash-4.3$ shopt -s globstarbash-4.3$ for i in  ./**/*.xml; do printf "%s\n" "$i" ; done./adwaita-timed.xml./bin/hw5/stuff/book/chapter42servletexample/build/web/META-INF/context.xml./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/beans.xml./bin/hw5/stuff/book/chapter42servletexample/build/web/WEB-INF/web.xml

पर्ल

पर्ल में एक मॉड्यूल है Find, जो पुनरावर्ती निर्देशिका ट्री ट्रैवर्सल के लिए अनुमति देता है । विशेष के भीतर find() फ़ंक्शन, हम एक वांछित सबरूटीन और उस निर्देशिका को परिभाषित कर सकते हैं जिसे हम पार करना चाहते हैं, इस उदाहरण में .. ऐसे मामले में एक लाइनर होगा:

bash-4.3$ perl -le 'use File::Find; find(sub{-f && $_ =~ /.xml$/ && print $File::Find::name},".")' ./adwaita-timed.xml./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

अजगर

जबकि पर्ल में पुनरावर्ती पेड़ ट्रैवर्सल को समर्पित एक संपूर्ण मॉड्यूल है, पायथन में एक साफ कार्य है walk() कि का हिस्सा है os मॉड्यूल, और बार-बार शीर्ष पथ के ट्यूपल, सभी उपनिर्देशिकाओं की सूची, और फ़ाइल नामों की सूची देता है । हम निम्नलिखित कर सकते हैं:

bash-4.3$ python -c 'import os,sys; [ sys.stdout.write(os.path.join(r,i)+"\n") for r,s,f in os.walk(".") for i in f if i.endswith(".xml") ]' ./adwaita-timed.xml./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/beans.xml./CLEAR_DESKTOP/blahblah/hw5/stuff/book/jsf2demo/build/web/WEB-INF/web.xml./CLEAR_DESKTOP/blahblah/hw5/stuff/book/liangweb/build.xml

यह एक स्क्रिप्ट के रूप में बहुत दूर हो सकता है:

#!/usr/bin/env pythonimport os,sys for r,s,f in os.walk("."):     for i in f:         if i.endswith(".xml")              print(os.path.join(r,i))

खोजें

अन्य उत्तरों का उल्लेख किया है find पुनरावर्ती ट्रैवर्सल के लिए, और यह नौकरी के लिए जाने-माने उपकरण है । क्या उल्लेख की जरूरत है तथ्य यह है कि find कई कमांड लाइन स्विच हैं, जैसे -printf वांछित प्रारूप में आउटपुट प्रिंट करने के लिए, -type f केवल नियमित फ़ाइलें खोजने के लिए, -inum इनोड नंबर द्वारा खोजने के लिए, -mtime संशोधन तिथि द्वारा खोज करने के लिए, -exec <command> {} \; फ़ाइल को तर्क के रूप में पास करने के साथ फ़ाइल को संसाधित करने के लिए एक विशेष कमांड निष्पादित करने के लिए (जहां {} मानक है find वर्तमान फ़ाइल के लिए प्लेसहोल्डर) , और कई अन्य इसलिए कृपया मैनपेज पढ़ें find.

गनोम फ़ाइल प्रबंधक के अंदर आप आवर्धक-ग्लास आइकन (आमतौर पर शीर्ष-दाएं में) पर क्लिक कर सकते हैं और फिर वर्तमान फ़ोल्डर में खोज करने के लिए टाइप करना शुरू कर सकते हैं ।

कुछ लोगों (मुझे) के लिए यह बहुत आसान है कि कमांड-लाइन का उपयोग करना ।

आप ’ एलएस-आर / ग्रेप कर सकते हैं । एक्सएमएल`