Equivalente al comando de búsqueda de Unix en Windows

34

¿Cuál es el equivalente del comando de búsqueda de Unix en Windows?

Veo que find.exeen Windows es más como un grep. Estoy especialmente interesado en el equivalente de

find . -name [filename]
ARV
fuente
2
¿Hay algo mal con mi respuesta? ¿Puedo mejorarlo? ¿Aún necesitas ayuda?
JohannesM
Lo siento, había perdido de vista este hilo hace un tiempo. Gracias por su respuesta y disculpas por no aceptarlo antes.
ARV

Respuestas:

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

- alternativa -

dir /s <drive:>\<pattern>

ejemplo

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

- alternativa -

dir /s c:\example.txt
JohannesM
fuente
dir c: /s example.txttambién funciona.
DevSolar
@DevSolar, ¿puedes volver a verificar tu comando? Lo probé en Windows 5.1 Build 2600 SP3, y su comando solo me da la lista de archivos en el directorio c:
JohannesM
1
Uh ... lo siento. Me sirve el derecho de escribir de memoria. dir /s C:\example.txtestá.
DevSolar
1
para los resultados más similares que uso \bpara breve (solo rutas de salida); find <folder> -name <pattern>-> dir /s /b <folder><pattern>. Por ejemplo, find /tmp -name *.txt-> dir \s \b C:\temp\*.txt. Sin embargo, dirsiempre devuelve una lista de rutas absolutas, mientras que findsiempre proporciona rutas con el prefijo<folder>
Hashbrown
28

El Find-ChildItemCmdlet en Windows Powershell es un equivalente del comando de búsqueda de Unix / Linux

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

Algunas de las opciones 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

Divulgación: soy el desarrollador de Find-ChildItemcmdlet

Jagadish G
fuente
2
Gracias. Esto es definitivamente más en mente de lo que estaría buscando al responder esta pregunta.
supercheetah
77
Find-ChildItemno es un cmdlet oficial y no está incluido en PowerShell; tienes que descargar este cmdlet del OneDrive de algún chico . No hay diferencia entre eso y solo descargar bash, cygwin, unixutils o cualquier otro programa que simplemente te permita ejecutar UNIX find.
walen
19

Sin cmdlets adicionales instalados, simplemente puede usar Get-ChildItem:

Get-ChildItem -Filter *.zip -Recurse $pwd
djhaskin987
fuente
1
En cuyo caso, probablemente desee utilizar uno de los alias cortos dir, lso gci, a menos que esté escribiendo un script.
Swonkie
5

Si está utilizando la búsqueda de Unix para buscar archivos en una jerarquía de directorios, la forma de Powershell es usar el cmdlet Get-ChildItem(alias is gci) y filtrar los resultados con el cmdlet Where-Object(alias is where).

Por ejemplo, para buscar todos los archivos (comenzando C:\Users\y de forma recursiva) con la palabra 'esencial' en su nombre, use lo siguiente:

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

La -likeopción le permite usar comodines para la coincidencia de patrones.

Joshua Kan
fuente
2

Este no es exactamente el hallazgo de GNU, pero coincide más estrechamente con la filosofía de la línea de comando de Linux en powershell:

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

Ejemplo:

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: Todo lo que se devuelve después de "|% FullName" es una cadena, en lugar de un objeto.

También puede usar el Operador Where, "?", Sin embargo, es más trabajo y no mucho más rápido:

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

Aquí hay un atajo 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
fuente
Encuentra -exec grep {} de UnixUtils no funciona correctamente, parece que "no existe tal archivo o directorio". Esta solución: PowerShell.exe -Command "dir -Recurse -ea 0 |? FullName -like '* .log' | sls error", desde dentro de un script por lotes funciona. Nota: debe usar comillas simples adentro, comillas dobles afuera.
kevinf