Cómo buscar una cadena de texto en varios archivos y devolver los nombres de los archivos en Powershell?

He comenzado el aprendizaje de powershell hace un par de días, y no pude encontrar nada en google que hace lo que necesito así que por favor tengan paciencia con mi pregunta.

Me han pedido la sustitución de algunas cadenas de texto en varios archivos. No necesariamente conocer la extensión de los posibles archivos de destino y no sé su ubicación. Hasta ahora me las he arreglado para navegar de forma recursiva en el directorio (get-ChildItem -recurse) y encontrar la cadena que estaba buscando, con get-content y seleccionar la cadena:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

El problema es que yo puedo ver las ocurrencias del texto que estoy buscando, pero no sé cómo decirle PS para devolver la ruta de acceso y el nombre de todos los archivos coincidentes así.

¿Cómo puedo obtener el nombre y la ubicación de los archivos que contiene la expresión que estoy buscando?

  • Tal vez editar la pregunta a ser más genérico. La respuesta a esta pregunta no tiene nada que ver con JBoss o la aplicación que se está trabajando en la que parece…
  • Yo sólo vio su comentario y editado mi pregunta…2 años más tarde! mejor tarde que nunca..:)
InformationsquelleAutor Bluz | 2011-11-16

10 Kommentare

  1. 434

    Esto debería dar la ubicación de los archivos que contienen su patrón:

    Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
    • Lo que si también desea MOVER los archivos?… Estoy recibiendo un error con esta en que no puede unirse a un | Move-Elemento para el final de eso.
    • Mover-Elemento no tiene name parámetro. Trate de añadir | %{Move-Item $_.name <destination>}
    • Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path devuelve sólo el primer partido de cada archivo, por lo que puede ser un poco más eficaz y evita la necesidad de un grupo de ellos
    • vale la pena destacar que se puede filtrar sólo de un determinado tipo de archivo, decir txt archivos, si utiliza Get-ChildItem -Recurse -Filter *.txt lugar
    • Yo sugiero que escriban en una secuencia de comandos mediante un foreach bucle si usted está haciendo grandes operaciones como la de que. Se hace muy complicado cuando se intenta hacer todo eso en una línea y es muy fácil cometer un gran error. Hablo desde la experiencia
  2. 70

    Hay una variedad de respuestas precisas aquí, pero aquí es el más conciso de código para diferentes variaciones. Para cada variación, la línea superior muestra la sintaxis completa y la parte inferior se muestra lacónico sintaxis.

    Punto (2) es una forma más concisa la forma de las respuestas de Jon Z y manojlds, mientras que el punto (1) es equivalente a las respuestas de vikas368 y buygrush.

    1. Lista FileInfo objetos para todos los archivos que contiene el patrón:

      Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
      ls -r filespec | ? { sls pattern $_ -q }
      
    2. Lista nombres de archivo para todos los archivos que contiene el patrón:

      Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
      ls -r filespec | sls pattern | select -u Path
      
    3. Lista FileInfo objetos para todos los archivos no que contiene patrón:

      Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
      ls -r filespec | ? { !(sls pattern $_ -q) }
      
    4. Lista nombres de archivo para todos los archivos no que contiene patrón:

      (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
      (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
      
    • También, si usted está buscando los Archivos que contienen el patrón en cualquier lugar, se puede dar después de encontrar la primera instancia con la -List parámetro de Select-String
    • Me gustaría que el OP había pedido una ligera variación de la pregunta, de modo que este sería el AA. #1 fue muy útil y es obvio que @Michael Sorens groks PS!
  3. 14

    Canalizar el contenido de su

    Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

    a fl *

    Verás que el camino ya está siendo devuelto como una propiedad de los objetos.

    SI quieres sólo la ruta de acceso, uso select path o select -unique path para eliminar duplicados:

    Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path
    • Gracias a los dos, esto es exactamente lo que estoy buscando. Por desgracia, cuando hay muchos subdirectorios que participan en la ruta, entonces PS cortes de la ruta de acceso absoluta y suma tres puntos al final de la línea como \dir1 dir2\dir3\camino… así que no sé que archivo se devuelve. Hay una manera de decirle a PS a ser menos codiciosos de los personajes y molesta que muestra la ruta completa ? 🙂 Muchas gracias !
    • Usted necesita agregar el -File cambiar a Get-ChildItem o terminarás con una interminable cascada de errores tratando de llamar Get-Content en directorios.
    • Si usted necesita la ruta de acceso completa puede hacerlo (Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullName Personas parecen olvidar PowerShell es orientado a objetos; en caso de duda, busque una propiedad
  4. 14

    Esto mostrará la ruta de acceso, nombre de archivo y el contenido de la línea encontró que coinciden con el patrón.

    Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 
    • simple y claro! La mejor respuesta.
    • Si sólo una línea se podría añadir entre los resultados 🙂
  5. 9
    Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

    Esto le dará la información completa de todos los archivos

    • Totalmente no sabía que -r trabajado. Pensé que tenía que hacer siempre -Recurse
  6. 9

    Esta es la forma en que yo lo haría, usted no necesita obtener-contenido:

    ls -r | Select-String dummy | select line,path

    o

    ls -r | Select-String dummy | fl *

    Ver cuáles son las diferentes propiedades son…

    • +1, Esto funciona perfectamente para mi caso, sin embargo el uso select Pattern, LineNumber, Filename para más conciso de salida. Línea devuelve TODO en la línea que contiene su cadena de patrón. Usted puede también fácilmente los resultados a un archivo csv si usted desearía.
  7. 5

    Para mantener el archivo completo de los detalles en la matriz resultante se podría utilizar una ligera modificación de la respuesta publicada por vikas368 (que no parecen trabajar bien con el ISE de autocompletar):

    Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }

    o en corto:

    ls -r | ?{ $_ | Select-String -Pattern "dummy" }
  8. 5

    Si usted busca en un directorio, usted puede hacerlo:

    select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path
  9. 3

    Esto mostrará una lista de la ruta de acceso completa a cada archivo, que contiene la cadena de búsqueda:

    foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}

    Nota que no muestra un encabezado por encima de los resultados y no muestra las líneas de texto que contengan la cadena de búsqueda. Todo lo que nos dice es donde usted puede encontrar los archivos que contienen la cadena.

    • Alguna idea de cómo mostrar el número de línea donde el patrón se encuentra, junto con el nombre del archivo?
  10. 2

    He modificado una de las respuestas de arriba para darme un poco más de información. Esto me ahorró una segunda consulta más adelante. Era algo como esto:

    Get-ChildItem `
            -Path "C:\data\path" -Filter "Example*.dat" -recurse | `
        Select-String -pattern "dummy" | `
        Select-Object -Property Path,LineNumber,Line | `
        Export-CSV "C:\ResultFile.csv"

    Puedo especificar la ruta de acceso y el archivo de comodines con esta estructura, y se guarda el nombre de archivo, número de línea y la línea correspondiente a un archivo de salida.

    • Genial! Gracias por esta solución 🙂 sin Embargo, podría usted por favor, enlace a la respuesta que ha basado su solución y el nombre del autor de que la respuesta a dar crédito? Gracias!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea