Bir dizede birden çok dosyada nasıl arama yapılır ve Powershell'deki dosyaların adları nasıl döndürülür?


303

Powershell'i birkaç gün önce öğrenmeye başladım ve google'da ihtiyacım olan şeyi yapan bir şey bulamadım, lütfen soruma katlanın.

Bazı metin dizelerini birden çok dosyaya değiştirmem istendi. Mutlaka olası hedef dosyalarının uzantısını bilmiyorum ve onların konumlarını da bilmiyorum. Şimdiye kadar dizine ( get-ChildItem -recurse) özyinelemeye göz atmayı ve get-content ve select-string ile aradığım dizeyi bulmayı başardım:

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

Sorun şu ki, aradığım metnin oluşumlarını görebiliyorum, ancak PS'ye eşleşen her dosyanın yolunu ve adını döndürmesini nasıl söyleyeceğimi bilmiyorum.

Aradığım ifadeyi içeren dosyaların adını ve konumunu nasıl edinebilirim?


2
Belki soruyu daha genel olacak şekilde düzenleyin. Bu sorunun cevabı JBoss veya üzerinde çalıştığınız uygulamanızla ilgisi yok ...
Kolob Kanyonu

5
Yorumunu gördüm ve sorumu düzenledim ... 2 yıl sonra! hiç olmadığı kadar iyi geç .. :)
Bluz

Yanıtlar:


469

Bu, deseninizi içeren dosyaların konumunu vermelidir:

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

3
Bu dosyaları da taşımak istiyorsanız ne olur? ... Bir | Öğeyi bunun sonuna taşı.
rud3y

6
Move-Item nameparametresi yok. | %{Move-Item $_.name <destination>}
Eklemeyi

49
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Pathher dosya için sadece ilk eşleşmeyi döndürür, bu yüzden biraz daha verimli olabilir ve bunları gruplandırma gereğini ortadan kaldırır
ben

5
bunun yerine txtkullanırsanız, yalnızca belirli bir dosya türü için filtreleme yapabileceğinizi fark etmelisinizGet-ChildItem -Recurse -Filter *.txt
Girardi

@ rud3y foreachBöyle büyük işlemler yapıyorsanız, bir döngü kullanarak bir komut dosyasında yazmanızı şiddetle tavsiye ederim . Tüm bunları tek bir satırda yapmaya çalıştığınızda çok kıvrımlı hale gelir ve büyük bir hata yapmak çok kolaydır.
Deneyimden

75

Burada çeşitli doğru cevaplar var, ancak burada birkaç farklı varyasyon için en kısa kod. Her varyasyon için üst satır tam sözdizimini ve alt satır kısa sözdizimini gösterir.

Madde (2), Jon Z ve manojlds cevaplarının daha özlü bir şeklidir, madde (1) ise vikas368 ve buygrush'ın cevaplarına eşdeğerdir.

  1. Desen içeren tüm dosyalar için FileInfo nesnelerini listeleyin :

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
  2. Desen içeren tüm dosyalar için dosya adlarını listeleyin :

    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
  3. Liste FileInfo tüm dosyalar için nesneleri değil desen içeren:

    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
  4. Liste dosya adları tüm dosyalar için değil desen içeren:

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

Ayrıca, herhangi bir yerde deseni içeren Dosyaları arıyorsanız, ilk örneği bulduktan sonra -ListSelect-String
KyleMit

Keşke OP, sorunun AA olması için sorunun hafif bir varyasyonunu sormuş olsaydı. # 1 çok kullanışlıdır ve @Michael Sorens'in PS sevdiği açıktır!
cBlaine

20

Bu, kalıbla eşleşen yolu, dosya adını ve bulduğu içerik satırını görüntüler.

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

Sonuçlar arasına yalnızca bir satır eklenebilirse :)
cladelpino

15

İçeriğinizin içeriği

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

için fl *

Yolun zaten nesnelerin bir özelliği olarak döndürüldüğünü göreceksiniz.

Yalnızca yolu istiyorsanız, kopyaları kaldırmak için select pathveya select -unique pathdüğmesini kullanın :

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

1
İkinize de teşekkürler, tam da aradığım şey bu. Ne yazık ki, yolla ilgili birçok alt dizin olduğunda, PS mutlak yolu keser ve satırın sonuna \ dir1 \ dir2 \ dir3 \ path gibi üç nokta ekler ... böylece hangi dosyanın döndürüldüğünü bilmiyorum . PS'ye karakterlerde daha az açgözlü olduğunu ve tam yolu göstermesini rahatsız etmenin bir yolu var mı? :) Çok teşekkürler !
Bluz

3
-FileAnahtarı eklemeniz gerekir Get-ChildItemveya Get-Contentdizinleri çağırmaya çalışırken hiç bitmeyen bir hata dizisi ile sonuçlanır .
RubberDuck

Eğer tam yola ihtiyacınız varsa bunu yapabilirsiniz (Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullNameİnsanlar PowerShell nesne odaklı olduğunu unutuyor gibi görünüyor; şüphe
duyduğunuzda

10

Ben böyle yapardım, içeriğe ihtiyacınız yok:

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

veya

ls -r | Select-String dummy | fl *

Farklı özelliklerin neler olduğunu görmek için ...

Bu daha hızlı. İkinci argüman -filter:

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

2
+1, Bu benim durumum için mükemmel çalışıyor, ancak select Pattern, LineNumber, Filenamedaha özlü çıktı için kullanın . Çizgi, desen dizenizi içeren satırda HER ŞEY'i döndürür. İsterseniz bunu kolayca bir csv'ye de gönderebilirsiniz.
Protonova

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

Bu size tüm dosyaların tüm ayrıntılarını verecektir


Tamamen -rişe yaradığını bilmiyordum . Her zaman yapmak zorunda olduğunuzu -Recurse
düşündüm

5

Sonuç dizisinde tüm dosya ayrıntılarını korumak için, vikas368 tarafından gönderilen cevapta (ISE otomatik tamamlama ile iyi çalışmıyor gibi görünüyor) küçük bir değişiklik kullanabilirsiniz:

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

ya da kısaca:

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

5

Bir dizinde arama yaparsanız, bunu yapabilirsiniz:

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

4

Bu, arama dizesini içeren her dosyanın tam yolunun bir listesini görüntüler:

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

Sonuçların üstünde bir başlık göstermediğini ve arama dizesini içeren metin satırlarını göstermediğini unutmayın. Tek yapmanız gereken, dizeyi içeren dosyaları nerede bulabileceğinizdir.


2
Desenin bulunduğu satır numarasının dosya adıyla birlikte nasıl görüntüleneceği hakkında bir fikriniz var mı?
Piotr L

4

Yukarıdaki cevaplardan birini değiştirerek bana biraz daha bilgi verdim. Bu beni daha sonra ikinci bir sorgudan kurtardı. Şöyle bir şeydi:

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"

Bu yapılarla yol ve dosya joker karakterlerini belirtebilirim ve dosya adını, satır numarasını ve ilgili satırı bir çıktı dosyasına kaydeder.


Güzel! Bu ek çözüm için teşekkürler :) Ancak, lütfen çözümünüzü temel aldığınız cevaba bağlantı verebilir ve kredi vermek için bu cevabın yazarını adlandırabilir misiniz? Teşekkürler!
Max Vollmer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.