फ़ाइलों को खोज करने के लिए कैसे पुन: Sub Suboriesories में


116

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

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

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


2
आप कर सकते हैंls -R | grep .xml
निकोस

जवाबों:


90

फाइंड का उपयोग करके देखें

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

4
क्या सूडो को सुपर उपयोगकर्ता विशेषाधिकार सुनिश्चित करने के लिए होना चाहिए, या यह है?
शमीम हाफ़िज़

4
मैं आपको फैसला करने देता हूं। सूडो , नो सूडो
मिच

6
बस ब्याज से बाहर। findओवर का क्या फायदा ls -R?
don.joey

1
@ don.joey यह मदद कर सकता है stackoverflow.com/questions/13830036/...
मिच

10
-1 मिश्रण के लिए findऔर grep, जब findआप रेगेक्स और ग्लब्स दोनों का उपयोग करके फ़िल्टरिंग कर सकते हैं, और जब आप मिश्रण करने की आवश्यकता न हो, तो findएस -print0और जीआरईपी का उपयोग नहीं कर -zसकते।
मूरू

147

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

find . -name '*.xml'

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


2
क्या यह वर्तमान निर्देशिका में निहित निर्देशिका में आवश्यक रूप से आवश्यक फ़ाइल के लिए खोज करता है। मेरे मामले में यह केवल वर्तमान निर्देशिका में ही जाँच की गई, उपनिर्देशिका की जाँच नहीं की।
मुस्तफ़िज़ रहमान सेप

1
@mostafiz, आपको '* .xml' भाग उद्धृत करना होगा। मैं अपना उत्तर संपादित करूँगा।
कायरेक्ट

1
वास्तव में मैंने .phpवर्तमान निर्देशिका में फ़ाइलों की खोज की । लेकिन यह केवल .phpवर्तमान निर्देशिका में फाइलें लौटाता है, उप-निर्देशिका में पुनरावर्ती खोज नहीं करता है। इसीलिए मैं पूछ रहा हूं कि क्या findकमांड पुनरावर्ती खोज करता है या नहीं।
मुस्तफ़िज़ रहमान

3
@mostafiz, findकमांड पुनरावर्ती खोज करता है। यदि आप पैरामीटर को उद्धृत नहीं करते हैं, तो मुझे लगता है कि आपका शेल विस्तार कर सकता है *, इसलिए यह वर्तमान निर्देशिका में फ़ाइलों से मेल खाएगा।
कायरूक्ट

ठीक है! हो सकता है कि मैंने कुछ गलती की हो। अब यह पूरी तरह से काम कर रहा है!
मुस्तफ़िज़ रहमान

13

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

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

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


5
वैसे भी इस निर्देशिका को दिखाने के लिए इसे प्राप्त करने के लिए?
एडम जूल 28'15


4

दे घुमा के

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

bash-4.3$ shopt -s globstar
bash-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 python
import 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.