Cómo realizar búsquedas recursivas en Windows

En un artículo anterior expliqué con detalle cómo realizar búsquedas recursivas en Linux. Este artículo tiene el mismo objetivo que el anterior pero los procedimientos descritos serán para Windows. Para realizarlo, únicamente se necesitará de PowerShell que se incluye por defecto en todas las versiones recientes de este popular sistema operativo. Igual que en el caso anterior, una búsqueda recursiva se entiende como la búsqueda donde se analiza no solamente el nombre de todos los archivos y carpetas en una ubicación dada, sino que se analizan los contenidos de los archivos en búsqueda de coincidencias con el patrón utilizado.

Búsquedas con Get-ChildItem y Select-String

El procedimiento, al igual que en Ubuntu, es sumamente sencillo y el siguiente es el comando base sobre el que vamos a explicar los pasos:

Get-ChildItem -recurse | Select-String "patron" | Select Path, LineNumber | Format-List

Utilizando los poderosos cmdlets de PowerShell el proceso de encontrar cadenas de caracteres específicos en múltiples archivos y dar un formato adecuado a su presentación es sumamente sencillo. Recuerda que debes sustituir patron, por la palabra o frase que estés buscando. Es importante aclarar que en el caso del comando anterior, la búsqueda se realizará en la carpeta donde estemos actualmente ubicados, si deseas buscar en una ruta específica el comando correcto es el siguiente:

Get-ChildItem -Path D:\Documents\ -recurse | Select-String "patron" | Select Path, LineNumber | Format-List

En este ejemplo, la búsqueda será realizada en la ruta D:\Documents\

Explicación

El primer comando (cmdlet) utilizado es Get-ChildItem que es exactamente lo mismo que el comando ls en Linux (en PowerShell también se puede usar ls en lugar de Get-ChildItem). Básicamente realiza un listado de todos los archivos y carpetas en una ruta específica. La opción -recurse, permite no solo generar el listado de los archivos en la carpeta primaria, sino de todas las subcarpetas que se encuentran dentro de la carpeta principal. 

El resultado de dicho comando será entonces todos los archivos existentes dentro de la carpeta, y este será filtrado por el siguiente cmdlet: Select-String. Este comando es el equivalente a grep en Linux. Este, busca texto y patrones de texto dentro de una entrada de archivos (que en este caso está dada por el resultado del primer cmdlet). Para este caso entonces, buscará dentro de todos los archivos listados por Get-ChildItem

Posteriormente, el resultado del cmdlet Select-String será procesado por un dos comando con el único propósito de extraer información de los objetos generados por Select-String. En este caso va a obtener la ruta completa del archivo donde se encontró la coincidencia y el número de línea. Esto para facilitar la ubicación de los resultados por parte del usuario en los correspondientes archivos. 

Finalmente, el cmdlet Format-List presentará los resultados de forma legible y ordenada. 

Existen más opciones que puedes agregar al comando Select-String y Get-ChildItem para hacer la búsqueda más específica entre ellas:

  • -CaseSensitive: hace que la búsqueda se realize diferenciando entre mayúsculas y minúsculas en el patrón. Por defecto no se realiza esta diferenciación (es una opción de Select-String).
  • -Include: al igual que en el caso de Linux, sirve para incluir tipos específicos de archivos y ubicaciones (es una opción de Get-ChildItem).
  • -Exclude: lo mismo que el anterior, pero para excluir tipos de archivos (es una opción de Get-ChildItem).
Get-ChildItem -Path D:\Documents\ -Include *.txt,*.ini -recurse | Select-String -Pattern "patron" -CaseSensitive | Select Path, LineNumber | Format-List

En este ejemplo, se incluyen en la búsqueda únicamente los archivos con las extensiones .txt y .ini. Todos los demás quedan excluidos. Además se activa la opción -CaseSensitive para hacer la diferenciación entre mayúsculas y minúsculas en el patrón de búsqueda. 

Get-ChildItem -Path D:\Documents\ -Exclude *.jpeg,*.mp3  -recurse | Select-String -Pattern "patron" -CaseSensitive | Select Path, LineNumber | Format-List

En este ejemplo se excluyen únicamente los archivos con las extensiones .mp3 y .jpeg. Todos los demás archivos serán incluidos en la búsqueda. 

Si tienes alguna duda sobre el uso de esta serie de cmdlets para realizar búsquedas recursivas en Windows, nu dudes en compartirla en los comentarios del artículo. 

Fundador
Seguidor de Jesús. Escribo artículos en mi tiempo libre sobre temas de tecnología que me interesan.