2011-11-16 29 views
187

Empecé a aprender Powershell hace un par de días, y no pude encontrar nada en google que haga lo que necesito, así que por favor tengan paciencia con mi pregunta.¿Cómo buscar una cadena en varios archivos y devolver los nombres de los archivos en Powershell?

Se me ha pedido que sustituya algunas cadenas de texto en una aplicación Jboss que se ejecuta en Windows. No necesariamente conozco la extensión de los posibles archivos de destino y tampoco sé su ubicación. Hasta ahora he logrado navegar de forma recursiva en el directorio (get-ChildItem -recurse) y encontrar la cadena que estaba buscando con get-contenido y seleccione cuerdas:

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

El problema es que puede ver las ocurrencias del texto Estoy buscando, pero no sé cómo decirle a PS que devuelva la ruta y el nombre de todos los archivos coincidentes.

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

+0

Quizás edite la pregunta para ser más genérico. La respuesta a esta pregunta no tiene nada que ver con JBoss o con la aplicación en la que está trabajando parece ... –

Respuesta

289

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 
+1

¿Y si también quiere MUEVE esos archivos? ... Estoy obteniendo un error con esto donde puedo ' Únete a un | Move-Item al final de eso. – rud3y

+5

Move-Item no tiene el parámetro 'name'. Intenta agregar '| % {Move-Item $ _. Name } ' –

+24

' Get-ChildItem -Recurse | Select-String "ficticio" -Lista | Select Path' solo devuelve la primera coincidencia para cada archivo, por lo que puede ser un poco más eficiente y evita la necesidad de agruparlos – ben

12

Pipe el contenido de su

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

a fl *

Usted verá que el camino ya está siendo devuelto como una propiedad de los objetos.

SI usted quiere sólo la ruta, utilice select path o select -unique path para eliminar duplicados:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path 
+1

Gracias a los dos, esto es exactamente lo que estoy buscando. Desafortunadamente, cuando hay muchos subdirectorios involucrados en la ruta, PS corta la ruta absoluta y agrega tres puntos al final de la línea como \ dir1 \ dir2 \ dir3 \ path ... por lo que no sé qué archivo se devuelve . ¿Hay alguna manera de decirle a PS que sea menos codicioso con los personajes y se moleste en mostrar el camino completo? :) ¡Muchas gracias! – Bluz

+3

Necesita agregar el modificador '-File' a' Get-ChildItem' o termina con una cascada interminable de errores al intentar llamar 'Get-Content' en los directorios. – RubberDuck

9
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"} 

esto le dará todos los detalles de todos los archivos

+0

El comando más oscuro jamás –

5

Para mantener los detalles de los archivos completos en matriz resultante podría utilizar una ligera modificación de la respuesta publicada por vikas368 (que no parecía funcionar bien con el autocompletado ISE):

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

o en pocas palabras:

ls -r | ?{ $_ | Select-String -Pattern "dummy" } 
42

Hay una variedad de respuestas precisas aquí, pero aquí es el código más concisa para varias variantes. Para cada variación, la línea superior muestra la sintaxis completa y la parte inferior muestra la sintaxis breve.

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

  1. Lista FileInfo objetos para todos los archivos de patrones que contienen:

    Get-ChildItem -Recursefilespec| Where-Object { Select-Stringpattern$_ -Quiet } 
    ls -rfilespec| ? { slspattern$_ -q } 
    
  2. Lista nombres de archivo para todos los archivos que contienen patrón:

    Get-ChildItem -Recursefilespec| Select-Stringpattern| Select-Object -Unique Path 
    ls -rfilespec| slspattern| select -u Path 
    
  3. Lista FileInfo objetos para todos los archivos no que contiene patrón:

    Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) } 
    ls -rfilespec| ? { !(slspattern$_ -q) } 
    
  4. Lista nombres de archivo para todos los archivos no que contiene patrón:

    (Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }).FullName 
    (ls -rfilespec| ? { !(slspattern$_ -q) }).FullName 
    
+0

Además, si solo está buscando archivos que contengan el patrón en cualquier lugar, puede darse por vencido después de encontrar la primera instancia utilizando el parámetro '-List' de [' Select-String'] (https://technet.microsoft.com/en-us/library/hh849903.aspx) – KyleMit

+0

Ojalá el OP hubiera pedido una pequeña variación de la pregunta para que este fuera el AA. # 1 fue muy útil y es obvio que @Michael Sorens cree PS! – cBlaine

2

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

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

Tenga en cuenta que no muestra un encabezado encima de los resultados y no muestra las líneas de texto que contienen la cadena de búsqueda. Todo lo que le dice es dónde puede encontrar los archivos que contienen la cadena.

+2

¿Alguna idea de cómo mostrar el número de línea donde se encontró el patrón, junto con el nombre del archivo? –

5

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

Get-ChildItem -Path d:\applications\*config -recurse | Select-String -Pattern "dummy" 
3

Si usted busca en un directorio, puede hacerlo:

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

Ésta es la forma en que lo haría, no es necesario conseguir-contenido:

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

o

ls -r | Select-String dummy | fl 

Para ver cuál es la diferencia adecuada los vínculos son ...

+0

+1, Esto funciona perfectamente para mi caso, sin embargo, use 'seleccione Patrón, Número de línea, Nombre de archivo' para una salida más concisa. Line devuelve TODO en la línea que contiene su cadena de patrón. También puede enviar esto fácilmente a un csv si lo desea. – Protonova

Cuestiones relacionadas