Tengo un árbol de directorios que contiene ~150 archivos con una extensión específica ( .php
) organizados en diferentes carpetas. Algunos de estos archivos están marcados en la línea 2 para indicar un estado determinado. Sé que esta marca siempre está en la línea 2 y siempre sigue un formato específico.
Lo que estoy buscando es algo (un comando, un script, un programa) que pueda buscar en el directorio esta marca y darme un resultado como este, pero en un formato fácil de manipular:
Una solución ideal sería aquella que pueda proporcionar una lista de TODOS los .php
archivos, con la línea 2 del archivo al lado del nombre del archivo. La lista anterior hace esto sólo para archivos coincidentes.
Intenté usar find
en un for
bucle:
for %f in (*.php) do find "Oracle Status" %f
Pero esto sólo busca en el directorio actual y no lo formatea de forma amigable.
Respuesta1
Si está de acuerdo con el uso de PowerShell, este script debería hacer el trabajo:
Get-ChildItem *.php -Recurse | ForEach-Object {
$lines = Get-Content $_ -TotalCount 2
If ($lines.Length -GT 1 -And $lines[1].Length -GT 1 -And $lines[1].Contains('Oracle Status:')) {
New-Object -TypeName PSObject -Prop @{'FilePath' = $_.FullName; 'StatusLine' = $lines[1]}
}
}
Produce una salida similar a esta en la consola:
La versión que se muestra aquí buscó .txt
archivos con una Status:
línea, pero la pegada arriba hace lo que usted quiere.
Guarde el script como un .ps1
archivo, por ejemplo phpstatus.ps1
. Si nunca antes ha ejecutado un script de PowerShell, deberá ejecutar este comando una vez para permitir la ejecución de scripts:
Set-ExecutionPolicy Unrestricted -Scope CurrentUser
Una vez hecho esto, puede invocar el script desde un mensaje de PowerShell escribiendo .\
seguido de su nombre, por ejemplo .\phpstatus.ps1
. (La finalización con tabulación funciona). Dado que el resultado es una colección de objetos de PowerShell, puede usar comandos estándar de administración de datos de PowerShell en ellos.