একাধিক ফাইলে একটি স্ট্রিং কীভাবে অনুসন্ধান করবেন এবং পাওয়ারশেলের ফাইলের নামগুলি কীভাবে ফিরে আসবেন?


303

আমি কয়েক দিন আগে পাওয়ারশেল শিখতে শুরু করেছি এবং আমি গুগলে এমন কিছু খুঁজে পাইনি যা আমার যা প্রয়োজন তাই করে আমার প্রশ্নটি সহ্য করুন।

আমাকে একাধিক ফাইলে কিছু পাঠ্য স্ট্রিং প্রতিস্থাপন করতে বলা হয়েছে। আমি সম্ভাব্য টার্গেট ফাইলগুলির প্রসারণটি অগত্যা জানি না এবং আমি তাদের অবস্থানও জানি না। এখনও অবধি আমি ডিরেক্টরিতে পুনরাবৃত্তভাবে ব্রাউজ করতে সক্ষম হয়েছি ( get-ChildItem -recurse) এবং গেট-সামগ্রী এবং নির্বাচন-স্ট্রিংয়ের সাহায্যে আমি যে স্ট্রিংটি খুঁজছিলাম তা সন্ধান করতে পেরেছি:

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

সমস্যাটি হ'ল আমি যে পাঠ্যের সন্ধান করছি সেগুলির উপস্থিতিগুলি দেখতে পাচ্ছি, তবে আমি পিএসকে কীভাবে প্রতি মেলানো ফাইলগুলির পথ এবং নামটি ফিরে আসতে বলি তা জানি না।

আমি যে ফাইলগুলির সন্ধান করছি সেগুলির নাম এবং অবস্থান কীভাবে পেতে পারি?


2
প্রশ্নটি আরও সাধারণ হওয়ার জন্য সম্পাদনা করুন। এই প্রশ্নের উত্তরের জেবস বা আপনার যে অ্যাপ্লিকেশনটিতে আপনি কাজ করছেন তার সাথে কিছুই করার নেই ...
কলব ক্যানিয়ন

5
আমি আপনার মন্তব্যটি স্পট করেছি এবং আমার প্রশ্ন সম্পাদনা করেছি ... 2 বছর পরে! আগের চেয়ে আরও দেরী .. :)
ব্লুজ

উত্তর:


468

এটিতে আপনার প্যাটার্নযুক্ত ফাইলগুলির অবস্থান দেওয়া উচিত:

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

3
আপনি যদি এই ফাইলগুলিও মুভি করতে চান তবে কী হবে? ... আমি এইখানে একটি টিতে যোগদান করতে পারছি না যেখানে আমি এখানে একটি ত্রুটি পাচ্ছি এর শেষে মুভ-আইটেম।
rud3y

6
মুভ-আইটেমের nameপ্যারামিটার নেই। যোগ করার চেষ্টা করুন| %{Move-Item $_.name <destination>}
জুন

49
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Pathপ্রতিটি ফাইলের জন্য কেবল প্রথম ম্যাচ ফেরত দেয় তাই কিছুটা দক্ষ হতে পারে এবং তাদের গ্রুপ করার প্রয়োজন এড়ানো যায়
বেন

5
এটি লক্ষ্য করার মতো যে আপনি কেবলমাত্র একটি নির্দিষ্ট ফাইল প্রকারের জন্য ফিল্টার করতে পারেন txt, যদি আপনি Get-ChildItem -Recurse -Filter *.txtপরিবর্তে ব্যবহার করেন তবে ফাইলগুলি বলুন
Girardi

@ rud3y আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি যদি এটির foreachমতো বৃহত ক্রিয়াকলাপটি করেন তবে লুপ ব্যবহার করে কোনও স্ক্রিপ্টে এটি লিখে দিন । আপনি যখন এক লাইনে সমস্ত কিছু করার চেষ্টা করেন তখন এটি খুব জটিল হয়ে যায় এবং একটি বৃহত ভুল করা খুব সহজ। আমি অভিজ্ঞতা থেকে কথা বলি
কলব ক্যানিয়ন

74

এখানে বিভিন্ন সঠিক উত্তর রয়েছে, তবে এখানে বিভিন্ন বিভিন্ন পরিবর্তনের জন্য সবচেয়ে সংক্ষিপ্ত কোড। প্রতিটি পরিবর্তনের জন্য শীর্ষ রেখাটি সম্পূর্ণ সিনট্যাক্স এবং নীচের অংশটি সংশ্লেষের সিনট্যাক্স দেখায়।

আইটেম (2) হ'ল জোন জেড এবং মনোজাল্ডের উত্তরগুলির আরও সংক্ষিপ্ত রূপ, যখন আইটেম (1) বিকাশ 368 এবং বায়গ্রুশের উত্তরগুলির সমতুল্য।

  1. প্যাটার্নযুক্ত সমস্ত ফাইলের জন্য ফাইলআইএনফো অবজেক্টগুলি তালিকাভুক্ত করুন :

    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 খুব দরকারী ছিল এবং এটি স্পষ্টতই যে @ মিশেল সোরেন্স পিএস ছাঁটাই করেছেন!
সিব্লেইন

20

এটি পাথ, ফাইলের নাম এবং সামগ্রী পংক্তিতে এটি প্রদর্শিত হবে যা প্যাটার্নটির সাথে মিলেছে।

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

1
সহজ এবং পরিষ্কার! সেরা উত্তর।
দেবরেণগ্যাস্পার

ফলাফলের মধ্যে যদি কেবল একটি লাইন যুক্ত করা যায় তবে :)
ক্লাদেলপিনো

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
আপনাকে উভয়কে ধন্যবাদ, আমি ঠিক এটিই খুঁজছি। দুর্ভাগ্যক্রমে, যখন পথের সাথে অনেকগুলি উপ-ডিরেক্টরি জড়িত থাকে, তখন পিএস সম্পূর্ণ পথটি কেটে দেয় এবং লাইনের শেষে d dir1 \ dir2 \ dir3 \ পাথের মতো তিনটি বিন্দু যুক্ত করে ... তাই আমি জানি না কোন ফাইলটি ফিরে এসেছে । পিএসগুলিকে চরিত্রগুলির প্রতি কম লোভী হওয়ার এবং পুরো পথটি দেখানোর জন্য বিরক্ত করার কোনও উপায় আছে কি? :) অনেক ধন্যবাদ !
ব্লুজ

3
আপনাকে -Fileস্যুইচটি যুক্ত করতে হবে Get-ChildItemবা Get-Contentডিরেক্টরিতে কল করার চেষ্টা করে ত্রুটিগুলির কখনও শেষ না হওয়া ক্যাসকেড দিয়ে শেষ করতে হবে ।
রাবারডাক

আপনার যদি পুরো পথের প্রয়োজন হয় তবে আপনি এটি করতে পারেন (Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullNameলোকেরা পাওয়ারশেলটি অবজেক্ট অরিয়েন্টেড বলে ভুলে যায়; সন্দেহ হলে কোনও সম্পত্তি অনুসন্ধান করুন
কলব ক্যানিয়ন

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 পোস্ট করা উত্তরটির সামান্য পরিবর্তন ব্যবহার করতে পারেন (যা ISE স্বতঃপূরণের সাথে ভালভাবে কাজ করে না বলে মনে হয়):

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
ফাইলের নামের সাথে প্যাটার্নটি যেখানে পাওয়া গেছে সেখানে কীভাবে লাইন নম্বর প্রদর্শন করবেন?
পাইওটার এল

3

আমাকে কিছুটা আরও তথ্য দিতে আমি উপরের উত্তরগুলির মধ্যে একটিতে সংশোধন করেছি। এটি পরে আমাকে দ্বিতীয় জিজ্ঞাসা থেকে রেহাই দেয়। এটি এমন কিছু ছিল:

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"

আমি এই কাঠামোগুলি সহ পাথ এবং ফাইল ওয়াইল্ডকার্ডগুলি নির্দিষ্ট করতে পারি এবং এটি ফাইল নাম, লাইন নম্বর এবং একটি আউটপুট ফাইলে প্রাসঙ্গিক লাইন সংরক্ষণ করে।


শান্ত! এই অতিরিক্ত সমাধানের জন্য ধন্যবাদ :) তবে, আপনি দয়া করে নিজের সমাধানটির উপর ভিত্তি করে উত্তরটির সাথে লিঙ্ক করতে পারেন এবং ক্রেডিট দেওয়ার জন্য সেই উত্তরটির লেখকের নাম রাখতে পারেন? ধন্যবাদ!
ম্যাক্স ভলমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.