Me gustaría encontrar todos los archivos php en mi servidor cuya primera o segunda línea tenga más de N caracteres.
Me gustaría imprimir tanto el nombre del archivo como el contenido de la línea que se encontró.
¿Cómo haría esto? Estoy pensando en hacer grep, pero no sé cómo analizar líneas en un archivo con él.
Respuesta1
aquí tienes una manera de hacerlo:
MIN_WIDTH=30
for f in $(find / -iname '*\.php'); do
if [ $(head -n 2 "$f" | tail -n 1 | wc -c) -gt $MIN_WIDTH ] || [ $(head -n 1 "$f" | wc -c) -gt $MIN_WIDTH ]; then
echo "$f";
fi
done
aquí hay un desglose:
- buscar todos
.php
los archivos:find / -regex '.*\.php$'
- obtenga la segunda línea del archivo y cuente el número de caracteres:
head -2 "$f" | tail -1 | wc -c
- obtenga la primera línea del archivo y cuente el número de caracteres:
head -1 "$f" | wc -c
- compare si cada uno es mayor que $MIN_WIDTH: `[ $(...) -gt $MIN_WIDTH ]
- si cualquiera de ellos es mayor que
$MIN_WIDTH
:if […] | […]
- Imprima el nombre del archivo:
echo "$f"
Respuesta2
Una variante algo más corta que la de zmo
find -iname "*.php" -exec grep -HP '.{6,}' {} \; | grep -P '^.+:[12]:'
donde 6 es el número mínimo de caracteres. La -H
opción es imprimir el nombre del archivo incluso si solo se guarda el archivo (este es el caso, porque cada archivo encontrado se guarda por separado a través del {}
operador)