web-dev-qa-db-ja.com

パターンに一致するフォルダー内のファイル名をリストします(ファイルの内容を除く)

以下を使用して、$patternを含むフォルダー内のすべてのファイルを再帰的にリストします。

Get-ChildItem $targetDir -recurse | Select-String -pattern "$pattern" | group path | select name

しかし、その名前とcontent$patternが含まれているファイルの両方をリストしているようです。上記の$pattern="SAMPLE"を実行すると、

C:\tmp\config.include
C:\tmp\README.md
C:\tmp\specs\SAMPLE.data.nuspec
C:\tmp\specs\SAMPLE.Connection.nuspec

今:

C:\tmp\config.include
C:\tmp\README.md

実際にはSAMPLEキーワード/テキストが含まれていますが、私は気にしません。パターンに一致するコンテンツを持つファイルではなく、ファイル名をリストするコマンドが必要なだけです。私は何が欠けていますか?

以下の回答に基づいて、私も試しました:

$targetDir="C:\tmp\"
Get-ChildItem $targetDir -recurse | where {$_.name -like "SAMPLE"} | group path | select name

そして:

$targetDir="C:\tmp\"
Get-ChildItem $targetDir -recurse | where {$_.name -like "SAMPLE"} | select name

ただし、結果は返されません。

18
u123

TocomplementMattの役立つ答え

具体的には、Select-Stringにパイプしているのは[System.IO.FileInfo]オブジェクトであるため-これはGet-ChildItemが出力するもの-ではなくstrings、それはこれらのオブジェクトによって表されるファイルのcontentsです検索中です

各ファイルのパスのfile name部分のみを一致させる必要があり、パターンをwildcard expressionとして表現できると仮定すると、 Select-Stringが必要で、代わりにGet-ChildItem-Filterとともに使用できます。これは、Mattの答えのように、またはより低速ですが、少し強力な-Includeです。

警告

  • Select-String -Patternは、正規表現を受け入れます(例:.*sample.*; Get-Help about_Regular_Expressionsを参照)、

  • Get-ChildItem -Filter/-Includeワイルドカード式を受け入れます(例、*sample*; Get-Help about_Wildcardsを参照)-それらは異なるものです。

補足説明:filesのみに一致させる場合は、Get-ChildItemにファイルへの出力を制限するように指示できます(directories-Fileを使用します(同様に、-Directoryで出力をディレクトリに制限できます)。


Group-Object pathgroup path)は、.Pathによって出力される一致情報オブジェクトのSelect-Stringプロパティに完全なファイル名が含まれているため、意図したとおりに機能しないため、各ファイルを独自のグループに入れます-基本的に、ノーオペレーション。

Get-ChildItemだけを使用する場合、同等のプロパティ名は.FullNameになりますが、探しているのはparentパス(含まれるディレクトリのパス)、.DirectoryName)でグループ化することです。したがって、 :

... | Group-Object DirectoryName | Select-Object Name

これは、一致するファイル名を持つ少なくとも1つのファイルを含む各directoryの完全パスを出力します。
Select-Object NameNameは、.Nameによって返されるgroupオブジェクトのGroup-Objectプロパティを参照します。この場合は、.DirectoryNameプロパティの値です入力オブジェクト上。)

7
mklement0
get-ChildItem $targetDir -recurse | where {$_.name -like $pattern} | select name
4
Itchydon

私は@Itchydonによる答えを試しました

しかし、 '-like' $ patternの使用を追跡できませんでした。

ファイル名に32文字(文字と数字)を含むファイルをリストしようとしていました。

PS C:> Get-ChildItem C:\Users\ -Recurse | where {$_.name -match "[a-zA-Z0-9]{32}"} | select name

または

PS C:> Get-ChildItem C:\Users\010M\Documents\WindowsPowerShell -Recurse | Where-Object {$_.name -match "[A-Z0-9]{32}"} | select name

したがって、この場合、whereを使用するか、where-objectを使用するかは問題ではありません。

0
010 M

Select-stringを直接使用して、特定の文字列に一致するファイルを検索できます。はい、これはfilename:count:content ...などを返しますが、内部的にはこれらの名前は選択または省略できますが、必要なのは出力から「FileName」を選択して「select-object」にパイプするための「filename」。

したがって、「Subject:Webservices restarted」というパターンを持つすべての* .MSGファイルを選択するには、次の操作を実行できます。

Select-String -Path。*。MSG -Pattern 'Subject:WebServices Restarted' -List |オブジェクト選択ファイル名

また、これらのファイルをその場で削除するには、次のようにRMコマンドを使用してForEachステートメントを調べます。

Select-String -Path。*。MSG -Pattern 'Subject:WebServices Restarted' -List | select-objectファイル名| foreach {rm $ _。FileName}

私はこれを自分で試しましたが、100%動作します。

これが役立つことを願っています

0
Heider Sati