एकाधिक फ़ाइलों में एक स्ट्रिंग कैसे खोजें और पॉवर्सशेल में फ़ाइलों के नाम कैसे लौटाएं?


303

मैंने कुछ दिनों पहले ही पॉवरशेल सीखना शुरू कर दिया है, और मुझे Google पर ऐसा कुछ भी नहीं मिला, जो मुझे अपने सवाल के साथ चाहिए।

मुझे कुछ टेक्स्ट स्ट्रिंग्स को कई फाइलों में बदलने के लिए कहा गया है। मुझे जरूरी लक्ष्य फाइलों के विस्तार का पता नहीं है और मुझे उनका स्थान भी नहीं पता है। अब तक मैं निर्देशिका में पुनरावर्ती ब्राउज़ करने में कामयाब रहा हूं ( get-ChildItem -recurse) और वह स्ट्रिंग ढूंढता हूं जिसे मैं गेट-कंटेंट और चुनिंदा स्ट्रिंग के साथ देख रहा था।

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

समस्या यह है कि, मैं जिस पाठ की तलाश कर रहा हूं, उसके बारे में देख सकता हूं, लेकिन मुझे यह नहीं पता है कि पीएस को हर मेल करने वाली फाइलों के लिए पथ और नाम कैसे वापस करना है।

मैं उन फ़ाइलों का नाम और स्थान कैसे प्राप्त कर सकता हूं जिनमें वह अभिव्यक्ति है, जिसकी मुझे तलाश है?


2
हो सकता है कि प्रश्न को अधिक सामान्य होने के लिए संपादित करें। इस सवाल के जवाब का JBoss या आपके आवेदन से कोई लेना-देना नहीं है, जो आपको लगता है ...
Kolob Canyon

5
मैंने अभी आपकी टिप्पणी देखी और अपना प्रश्न संपादित किया ... २ साल बाद! देर से बेहतर कभी नहीं .. :)
ब्लज

जवाबों:


468

यह उन फ़ाइलों का स्थान देना चाहिए जिनमें आपका पैटर्न है:

Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path

3
क्या होगा यदि आप उन फ़ाइलों को भी बनाना चाहते हैं? ... मुझे इसमें एक त्रुटि मिल रही है जहाँ मैं शामिल नहीं हो सकता हूँ | उस के अंत में ले जाएँ-आइटम।
rud3y

6
मूव-आइटम में nameपैरामीटर नहीं है । जोड़ने की कोशिश करें| %{Move-Item $_.name <destination>}
jon Z

49
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Pathप्रत्येक फ़ाइल के लिए केवल पहला मैच लौटाता है, इसलिए यह थोड़ा अधिक कुशल हो सकता है और उन्हें समूह बनाने की आवश्यकता से बचता है
ben

5
यह ध्यान देने योग्य है कि आप केवल एक निश्चित फ़ाइल प्रकार के लिए फ़िल्टर कर सकते हैं, txtफ़ाइलों को कह सकते हैं, यदि आप Get-ChildItem -Recurse -Filter *.txtइसके बजाय उपयोग करते हैं
गिरधारी

@ rud3y मैं अत्यधिक सुझाव देता हूं कि foreachयदि आप इस तरह से बड़े ऑपरेशन कर रहे हैं तो आप इसे एक लूप का उपयोग करके स्क्रिप्ट में लिख सकते हैं। यह बहुत जटिल हो जाता है जब आप एक पंक्ति में वह सब करने की कोशिश करते हैं और एक बड़ी गलती करना बहुत आसान है। मैं अनुभव से बोलता हूं
कोलोब कैनियन

74

यहां विभिन्न प्रकार के सटीक उत्तर हैं, लेकिन यहां कई विभिन्न रूपों के लिए सबसे संक्षिप्त कोड है। प्रत्येक भिन्नता के लिए, शीर्ष रेखा पूर्ण सिंटैक्स दिखाती है और निचला भाग सिंटैक्स दिखाता है।

आइटम (2) जॉन जेड और मनोजों के उत्तरों का अधिक संक्षिप्त रूप है, जबकि आइटम (1) vikas368 से उत्तर और बगरूश के बराबर है।

  1. सभी फाइलों के लिए FileInfo ऑब्जेक्ट्स की सूची बनाएं जिसमें पैटर्न है:

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
  2. पैटर्न युक्त सभी फ़ाइलों के लिए सूची नामों को सूचीबद्ध करें :

    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
  3. सभी फाइलों के लिए फ़ाइलइन्फो ऑब्जेक्ट्स सूचीबद्ध करें जिनमें पैटर्न नहीं है :

    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
  4. सभी फ़ाइल के लिए फ़ाइल नाम सूची जिसमें प्रतिमान नहीं है :

    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
    

इसके अलावा, अगर आप ऐसी फ़ाइलों की तलाश कर रहे हैं, जिनमें कहीं भी पैटर्न है, तो आप पहले उदाहरण को खोजने के बाद हार -ListSelect-String
मान सकते हैं

काश, ओपी ने सवाल का थोड़ा बदलाव पूछा होता ताकि यह एए हो। # 1 बहुत उपयोगी था और यह स्पष्ट है कि @ मिचेल सोरेंस पीएस!
cBlaine

20

यह पथ, फ़ाइल नाम और सामग्री लाइन को प्रदर्शित करेगा जो पैटर्न से मेल खाता है।

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 

अगर परिणामों के बीच केवल एक रेखा जोड़ी जा सकती है :)
क्लैडपिनो

15

अपनी सामग्री को पाइप करें

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

सेवा fl *

आप देखेंगे कि पथ पहले से ही वस्तुओं की संपत्ति के रूप में वापस आ रहा है।

यदि आप केवल पथ चाहते हैं, तो डुप्लिकेट को निकालें select pathया select -unique pathनिकालें:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path

1
आप दोनों का शुक्रिया, यह वही है जिसकी मुझे तलाश है। दुर्भाग्य से, जब पथ में कई उपनिर्देशिकाएँ शामिल होती हैं, तो PS निरपेक्ष पथ को काट देता है और पंक्ति के अंत में तीन डॉट्स जोड़ता है जैसे \ dir1 \ dir2 \ dir3 \ path ... तो मुझे नहीं पता कि कौन सी फ़ाइल वापस आ गई है । क्या पात्रों पर कम लालची होने और पूर्ण मार्ग दिखाने में परेशान करने का एक तरीका है? :) बहुत बहुत धन्यवाद !
१२:१२ पर ब्लुज १

3
आपको -Fileस्विच को जोड़ने की आवश्यकता है Get-ChildItemया आप Get-Contentनिर्देशिकाओं पर कॉल करने की कोशिश से त्रुटियों के कभी न खत्म होने वाले झरना के साथ समाप्त होते हैं ।
रबरडुक

यदि आपको पूर्ण पथ की आवश्यकता है, तो आप ऐसा कर सकते हैं (Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullNameलोग यह भूल जाते हैं कि PowerShell ऑब्जेक्ट ओरिएंटेड है; जब संदेह में, एक संपत्ति की तलाश करें
कोलोब कैनियन

10

यह है कि मैं इसे कैसे करूंगा, आपको सामग्री प्राप्त करने की आवश्यकता नहीं है:

ls -r | Select-String dummy | select line,path

या

ls -r | Select-String dummy | fl *

यह देखने के लिए कि विभिन्न गुण क्या हैं ...

यह तेज है। दूसरा तर्क है -फिल्टर:

ls -r . *.bat | select-string netsh

2
+1, यह मेरे मामले के लिए पूरी तरह से काम करता है, हालाँकि select Pattern, LineNumber, Filenameअधिक संक्षिप्त आउटपुट के लिए उपयोग होता है। लाइन आपके पैटर्न स्ट्रिंग वाले लाइन पर हर पल रिटर्न करती है। यदि आप चाहें तो आप इसे आसानी से सीएसवी पर भी आउटपुट कर सकते हैं।
प्रोटानोवा

9
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

यह आपको सभी फाइलों का पूरा विवरण देगा


पूरी तरह से पता नहीं था कि -rकाम किया। लगा कि आपको हमेशा करना है-Recurse
कोलोब कैनियन

5

परिणामी सरणी में संपूर्ण फ़ाइल विवरण रखने के लिए आप vikas368 द्वारा पोस्ट किए गए उत्तर के एक मामूली संशोधन का उपयोग कर सकते हैं (जो आईएसई स्वत: पूर्ण के साथ अच्छी तरह से काम नहीं करता था):

Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }

या संक्षेप में:

ls -r | ?{ $_ | Select-String -Pattern "dummy" }

5

यदि आप एक निर्देशिका में खोज करते हैं, तो आप इसे कर सकते हैं:

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path

4

यह खोज स्ट्रिंग वाले प्रत्येक फ़ाइल के लिए पूर्ण पथ की एक सूची प्रदर्शित करेगा:

foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}

ध्यान दें कि यह परिणामों के ऊपर एक हेडर प्रदर्शित नहीं करता है और खोज स्ट्रिंग वाले पाठ की पंक्तियों को प्रदर्शित नहीं करता है। यह सब आपको बताता है कि आप उन फ़ाइलों को कहाँ पा सकते हैं जिनमें स्ट्रिंग है।


2
किसी भी विचार को फ़ाइल नाम के साथ मिलकर पैटर्न नंबर कहाँ प्रदर्शित करना है?
पायोत्र एल

4

मैंने मुझे थोड़ा और जानकारी देने के लिए ऊपर दिए गए उत्तरों में से एक को संशोधित किया। इसने मुझे बाद में दूसरी क्वेरी दी। यह कुछ इस तरह था:

Get-ChildItem `
        -Path "C:\data\path" -Filter "Example*.dat" -recurse | `
    Select-String -pattern "dummy" | `
    Select-Object -Property Path,LineNumber,Line | `
    Export-CSV "C:\ResultFile.csv"

मैं इस संरचना के साथ पथ और फ़ाइल वाइल्डकार्ड निर्दिष्ट कर सकता हूं, और यह फ़ाइलनाम, पंक्ति संख्या और प्रासंगिक पंक्ति को आउटपुट फ़ाइल में सहेजता है।


ठंडा! इस अतिरिक्त समाधान के लिए धन्यवाद :) हालाँकि, क्या आप उस उत्तर से लिंक कर सकते हैं जिसे आपने अपने समाधान के आधार पर दिया है और क्रेडिट देने के लिए उस उत्तर के लेखक का नाम बताइए? धन्यवाद!
मैक्स वोल्मर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.