Equivalente ao comando find do Unix no Windows

34

Qual é o equivalente do comando find do Unix no Windows?

Eu vejo que o find.exeWindows é mais parecido com um grep. Estou especialmente interessado no equivalente a

find . -name [filename]
ARV
fonte
2
Há algo errado com a minha resposta? Posso melhorar? Você ainda precisa de ajuda?
JohannesM
Desculpe, eu tinha perdido esse tópico de vista há um tempo atrás. Agradecemos sua resposta e desculpas por não aceitá-la antes.
ARV

Respostas:

21
dir <drive: [drive:]> /s | findstr /i <pattern>

- alternativo -

dir /s <drive:>\<pattern>

exemplo

dir c: d: /s | findstr /i example.txt

- alternativo -

dir /s c:\example.txt
JohannesM
fonte
dir c: /s example.txtfunciona também.
DevSolar
@DevSolar, você pode verificar novamente o seu comando? Eu testei no Windows 5.1 Build 2600 SP3, e seu comando apenas me fornece a lista de arquivos no diretório c:
JohannesM
11
Desculpe. Serve para eu digitar da memória. dir /s C:\example.txtisto é.
DevSolar
11
para os resultados mais semelhantes que uso \bpara breve (somente caminhos de saída); find <folder> -name <pattern>-> dir /s /b <folder><pattern>. Por exemplo find /tmp -name *.txt-> dir \s \b C:\temp\*.txt. No entanto dirsempre retorna uma lista de caminhos absolutos, ao passo que findsempre dá caminhos prefixados com<folder>
Hashbrown
28

O Find-ChildItemcmdlet no Windows Powershell é equivalente ao comando find do Unix / Linux

http://windows-powershell-scripts.blogspot.in/2009/08/unix-linux-find-equivalent-in.html

Algumas das opções de Find-ChildItem

  1. Find-ChildItem -Type f -Name ".*.exe"
  2. Find-ChildItem -Type f -Name "\.c$" -Exec "Get-Content {} | Measure-Object -Line -Character -Word"
  3. Find-ChildItem -Type f -Empty
  4. Find-ChildItem -Type f -Empty -OutObject
  5. Find-ChildItem -Type f -Empty -Delete
  6. Find-ChildItem -Type f -Size +9M -Delete
  7. Find-ChildItem -Type d
  8. Find-ChildItem -Type f -Size +50m -WTime +5 -MaxDepth 1 -Delete

Divulgação: eu sou o desenvolvedor do Find-ChildItemcmdlet

Jagadish G
fonte
2
Obrigado. Definitivamente, isso está mais em mente do que eu procuraria ao responder a essa pergunta.
Supercheetah
7
Find-ChildItemnão é um cmdlet oficial e não está incluído no PowerShell; você precisa baixar esse cmdlet do OneDrive de alguém . Não há diferença entre isso e apenas baixar o bash, cygwin, unixutils ou qualquer outro programa que permita executar o UNIX find.
walen
19

Sem nenhum cmdlets adicional instalado, você pode simplesmente usar Get-ChildItem:

Get-ChildItem -Filter *.zip -Recurse $pwd
djhaskin987
fonte
11
Caso em que você provavelmente vai querer usar um dos curtas aliases dir, lsou gci, a menos que você está escrevendo um script.
Swonkie
5

Se você estiver usando a localização do Unix para procurar arquivos em uma hierarquia de diretórios, a maneira do PowerShell é usar o cmdlet Get-ChildItem(alias is gci) e filtrar os resultados com o cmdlet Where-Object(alias is where).

Por exemplo, para localizar todos os arquivos (iniciando C:\Users\e recursivamente) com a palavra 'essencial' em seu nome, use o seguinte:

PS> gci -Path "C:\Users\"  -Recurse | where {$_.Name -like '*essential*'}

A -likeopção permite que você use curingas para correspondência de padrões.

Joshua Kan
fonte
2

Este não é exatamente o que o GNU encontra, mas se aproxima mais da filosofia da linha de comando do linux no powershell:

PS> dir -recurse -ea 0 | % FullName | sls <grep_string>

Exemplo:

PS> cd C:\
PS> dir -recurse -ea 0 | % FullName | sls "Program" | sls "Microsoft"
PS> dir -recurse -ea 0 | % FullName | sls "Program" | sls "Microsoft" | out-gridview

Nota: Tudo o que é retornado após "|% FullName" é uma sequência, em vez de um objeto.

Você também pode usar o operador Where, "?", No entanto, é mais trabalhoso e não muito mais rápido:

PS> cd C:\
PS> dir -Recurse -ea 0 | ? FullName -like "*Program*" 
                       | ? FullName -like "*Microsoft*" 
                       | % FullName 
                       | out-gridview

Aqui está um atalho rápido:

PS> function myfind {dir -recurse -ea 0 | % FullName | sls $args }

PS> cd C:\
PS> myfind "Programs" | sls "Microsoft"

#find all text files recursively from current directory
PS> myfind "\.txt$"

#find all files recursively from current directory
PS> myfind .
Bill Moore
fonte
Encontre -exec grep {} do UnixUtils não funciona corretamente, parece "que não existe esse arquivo ou diretório". Esta solução: PowerShell.exe -Command "dir -Recurse -ea 0 |? FullName - como '* .log' | sls error", de dentro de um script em lote funciona. Nota: deve usar aspas simples dentro, aspas duplas fora.
Kevinf #