Gostaria de encontrar todos os arquivos php no meu servidor cuja primeira ou segunda linha tenha mais de N caracteres.
Gostaria de imprimir o nome do arquivo e o conteúdo da linha encontrado.
Como eu faria isso? Estou pensando em fazer o grep, mas não sei como analisar linhas de um arquivo com ele.
Responder1
aqui está uma maneira de fazer isso:
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
aqui está um detalhamento:
- procure todos
.php
os arquivos:find / -regex '.*\.php$'
- pegue a segunda linha do arquivo e conte o número de caracteres:
head -2 "$f" | tail -1 | wc -c
- pegue a primeira linha do arquivo e conte o número de caracteres:
head -1 "$f" | wc -c
- compare se cada um é maior que $MIN_WIDTH: `[ $(…) -gt $MIN_WIDTH ]
- se algum deles for maior que
$MIN_WIDTH
:if […] | […]
- imprima o nome do arquivo:
echo "$f"
Responder2
Uma variante um pouco mais curta que a do zmo
find -iname "*.php" -exec grep -HP '.{6,}' {} \; | grep -P '^.+:[12]:'
onde 6 é o número mínimo de caracteres. A -H
opção é imprimir o nome do arquivo mesmo que apenas o arquivo seja grepado (este é o caso, porque cada arquivo encontrado é grepado separadamente através do {}
operador)