Конвейер Get-Childitem в SelectString выбирает содержимое файла вместо имен файлов

Я пытаюсь сделать эквивалент команды Linux find . | grep [search_string] в Powershell.

Когда я вызываю Get-ChildItem -recurse | Select-String [search_string], он сопоставляет содержимое файлов, а не только имена файлов, которые я пытаюсь сопоставить.

Как заставить его смотреть только имена файлов?


person PortMan    schedule 05.04.2016    source источник


Ответы (3)


Сначала разверните свойство Name или FullName файловых объектов:

Get-ChildItem -Recurse |
    Select-Object -Expand FullName |
    Select-String [search_string]

Чтобы получить полное имя совпадений, разверните свойство Line результирующих MatchInfo объектов:

Get-ChildItem -Recurse |
    Select-Object -Expand FullName |
    Select-String [search_string] |
    Select-Object -Expand Line

или используйте фильтр Where-Object вместо Select-Object:

Get-ChildItem -Recurse |
    Select-Object -Expand FullName |
    Where-Object { $_ -match [search_string] }
person Ansgar Wiechers    schedule 05.04.2016
comment
Как я могу получить полный путь к выбранным файлам? - person PortMan; 05.04.2016

Лучше использовать для этого командлет Where-Object и просто сопоставлять имена файлов таким образом.

Например, предположим, что у вас есть такой каталог, и вы хотите просто получить файлы с ham в имени.

Directory: T:\stack


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         4/5/2016  11:28 AM                cat-1
d-----         4/5/2016  11:28 AM                cat-2
d-----         4/5/2016  11:28 AM                cat-3
d-----         4/5/2016  11:28 AM                cat-4
d-----         4/5/2016  11:28 AM                cat-5
d-----         4/5/2016  11:28 AM                dog-1
d-----         4/5/2016  11:28 AM                dog-2
d-----         4/5/2016  11:28 AM                dog-3

Используя этот синтаксис Dir | Where-Object Name -like *string*, вы можете легко найти соответствующие файлы или папки:

dir | ? Name -like ham*


    Directory: T:\stack


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         4/5/2016  11:28 AM                ham-1
d-----         4/5/2016  11:28 AM                ham-2
d-----         4/5/2016  11:28 AM                ham-3
d-----         4/5/2016  11:28 AM                ham-4
d-----         4/5/2016  11:28 AM                ham-5
person FoxDeploy    schedule 05.04.2016

Легкий

function locate{
    param(
        [Parameter(Mandatory=$False,Position=2)]
        [string] $loc = '.',
        [Parameter(Mandatory=$True,Position=1)]
        [string] $search
    )
    (gci $loc -Recurse).FullName | Select-String $search
}

Применение

PS C:\Users\username\Documents> locate somefile

C:\Users\username\Documents\somefile.csv

or

PS C:\Users\username\Documents> locate somefile ..

C:\Users\username\Documents\somefile.csv
C:\Users\username\Downloads\somefile.txt
C:\Users\username\Pictures\somefile.pst
person Chris Kuperstein    schedule 05.04.2016