Powershell - nomes de arquivos que correspondem a dois (ou mais) padrões

1

Para encontrar arquivos em um diretório com "foo" e "bar" no nome do arquivo, podemos usar:

Get-ChildItem | Where-Object {$_.Name -like "*foo*" -and $_.Name -like "*bar*"}

Existe uma maneira mais elegante de escrever (ou consultar) isso?

    
por root 23.05.2016 / 15:03

4 respostas

3

Por que você considera seu comando deselegante? Se você está apenas após um código mais conciso, isso pode ser melhor na Revisão de código.

Por acaso, não acho que esse comando funcione.

Se você quiser usar -like , adicione curingas:

gci | ? {$_.Name -like "*foo*" -and $_.Name -like "*bar*"}

Se você não quiser usar curingas, use -match :

gci | ? {$_.Name -match "foo" -and $_.Name -match "bar"}

Existem muitas maneiras de esfolar um gato

gci *foo* | ? {$_.Name -in (gci *bar*).Name}

Acho que um código mais elegante é subjetivo e depende do seu estilo de codificação. Eu pessoalmente prefiro sua linha de código, pois ela não é nem um pouco críptica, e é bastante compacta para o que ela faz.

    
por 24.05.2016 / 05:32
1

Outra maneira de fazer isso é usar correspondência de expressões regulares:

Get-ChildItem | Where-Object {$_.Name -match "(?=.*foo)(?=.*bar)"

Se você estiver usando versões mais curtas, também poderá abreviá-lo para:

gci |? {$_.Name -match "(?=.*foo)(?=.*bar)"

    
por 25.05.2016 / 14:22
0

Aqui estão duas possibilidades:

gci | ? Name -like *foo* | ? Name -like *bar*

gci *foo* | ? Name -like *bar*

Concordo com o ST8, embora a sua versão esteja correta.

    
por 24.05.2016 / 09:21
0

Como eu entendo o título desta pergunta, a resposta seria como:

'*.txt','*.log' | ForEach-Object { Get-ChildItem $_ }   # 'pure' Powershell
where.exe /r . *.txt *.log                              # external command

Mas, para obter apenas arquivos que têm 'foo' e 'bar' em seus nomes (o que considero um padrão), algumas soluções óbvias podem ser:

Get-ChildItem *foo*bar*                           # if the order is given
Get-ChildItem  '
  | Where-Object Name -match 'foo.*bar|bar.*foo'  # if not
    
por 21.05.2018 / 10:34

Tags