¿Hay algo como el comando de localización GNU en PowerShell?

8

¿Hay un equivalente del locatecomando GNU en Windows 7/8?

locate puede tomar como entrada un nombre de archivo y da como salida todas las rutas donde los archivos nombrados de manera similar a la entrada son, por ejemplo:

locate file-with-long-name.txt
/var/www/file-with-long-name.txt
Maquinilla de afeitar
fuente
Para aquellos de nosotros que no sabemos locate, ¿puede describir lo que quiere que haga?
Jay Bazuzi el
@JayBazuzi Lo hice incluso si era claramente menos que claro, editado para aclarar y agregado salida de muestra
Razor
¿Qué significa "similar"?
Jay Bazuzi
No lo dijiste, pero supongo que te refieres a GNU localizar. Modificaré tu pregunta.
Jay Bazuzi el
@JayBazuzi, por ejemplo, buscando index.htm también encuentra index.html
Razor

Respuestas:

7

No, no hay un cmd de Windows o PowerShell integrado equivalente al locatecomando de Linux / GNU . Sin embargo, los equivalentes funcionales incluyen cmd.exe dir /scomo se describe en JKarthik, y estas opciones de PowerShell:

PS> Get-ChildItem -Recurse . file-with-long-name.txt

Tenga en cuenta el uso de ., diciéndole a PowerShell desde dónde comenzar la búsqueda. Por supuesto, puede acortar al escribir en la línea de comando:

PS> gci -r . file-with-long-name.txt

Hago esto mucho, así que agregué una función a mi perfil:

PS> function gcir { Get-ChildItem -Recurse . @args }
PS> gcir file-with-long-name.txt

Esto permite comodines, similares a locate:

PS> gcir [a-z]ooo*.txt

Ver help about_Wildcardspara más detalles. Eso también se puede escribir Where-Objectasí:

PS> gcir | where { $_ -like "[a-z]ooo*.txt"}

locatetiene una opción para combinar con expresiones regulares. También lo hace PowerShell:

PS> gcir | where { $_ -match "A.*B" }

PowerShell admite expresiones regulares .NET completas. Ver about_Regular_Expressions.

También puede hacer otros tipos de consultas:

PS> gcir | where { $_.Length -gt 50M }  # find files over 50MB in size

El rendimiento de estos enfoques es lento para grandes colecciones de archivos, ya que solo busca en el sistema de archivos. GNU locateusa una base de datos . Windows ahora tiene una base de datos de búsqueda, llamada Windows Desktop Search . Hay una API para WDS, que alguien ha incluido con un cmdlet de PowerShell, aquí: http://www.codeproject.com/Articles/14602/Windows-Desktop-Search-Powershell-Cmdlet , que permite cosas como:

PS> get-wds “kind:pics datetaken:this month cameramake:pentax” 

con un rendimiento mucho mejor que Get-ChildItem, y este tipo de consulta enriquecida (y sintaxis incómoda). Además, tenga en cuenta que las comillas rizadas funcionan bien en PowerShell, por lo que no es necesario editar esa muestra al copiarla / pegarla.

Quizás alguien encuentre (o escriba) cmdlets de PowerShell que permitan consultas idiomáticas a WDS.

Jay Bazuzi
fuente
2

Para una solución PowerShell, intente esto:

Get-ChildItem -Filter "file-with-long-name.txt" -Recurse

Esto devuelve todos los archivos que coinciden con el nombre dado en el directorio actual y sus subdirectorios.

El -Filterparámetro acepta comodines. Si el directorio actual contiene archivos del sistema a los que no tiene acceso, agréguelos -ErrorAction SilentlyContinuepara suprimir los errores.

Para más información, ver Get-Help Get-ChildItem.

Indrek
fuente
1
En el símbolo del sistema, abrevío -ErrorAction SilentlyContinuea -ea 0, para facilitar la escritura.
Jay Bazuzi
Esta respuesta se antepone mejor con una advertencia sobre la gran diferencia entre locate(que examina una base de datos generada previamente, con la ventaja de la velocidad y la desventaja de no estar instantáneamente actualizado) y Get-ChildItem.
sancho.s
2

Puede usar el siguiente comando en el shell de Windows:

dir [filename] /s

Donde nombre de archivo es el nombre del archivo que está buscando y /shace referencia a incluir subdirectorios en la búsqueda.

Actualización El siguiente comando con /Bmuestra solo el formato desnudo, exactamente como se requiere. Y esto parece ser un poco más rápido.

Intenta:

 dir [filename] /s /B

Fuente: Lista de línea de comandos de Windows 8 y referencia

tempidope
fuente
Esto es bastante lento en comparación con Linux, pero finalmente encuentra el archivo. La marcará como respuesta si nadie más encuentra una alternativa más rápida
Razor el
1
Hola, / B se muestra en formato simple (solo la ubicación del archivo) y esto parece ser un poco más rápido. Verifica
tempidope
La diferencia es que se localeve en una base de datos (generada / actualizada por updatedb) y en dirrealidad busca en el disco duro completo.
Joachim Sauer el
1
dir/ses lento porque fuerza a la búsqueda (busca en todas partes ). Se remonta a DOS (siendo un comando de DOS), por lo que funciona de esa manera. Sospecho que la única razón por la que todavía existe es como una alternativa en caso de que su base de datos de índice no sea adecuada.
Ben Richards
Esta respuesta se antepone mejor con una advertencia sobre la gran diferencia entre locate(que analiza una base de datos generada previamente, con la ventaja de la velocidad y la desventaja de no estar instantáneamente actualizado) y Get-ChildItem.
sancho.s