Я хотел бы найти все php-файлы на моем сервере, первая или вторая строка которых содержит более N символов.
Я хотел бы распечатать как имя файла, так и содержимое найденной строки.
Как мне это сделать? Я думаю использовать grep, но не знаю, как с его помощью анализировать строки в файле.
решение1
Вот как это сделать:
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
вот разбивка:
- поиск всех
.php
файлов:find / -regex '.*\.php$'
- возьмите вторую строку файла и посчитайте количество символов:
head -2 "$f" | tail -1 | wc -c
- получить первую строку файла и подсчитать количество символов:
head -1 "$f" | wc -c
- сравните, больше ли каждое из них, чем $MIN_WIDTH: `[ $(…) -gt $MIN_WIDTH ]
- если любой из них больше, чем
$MIN_WIDTH
:if […] | […]
- распечатайте имя файла:
echo "$f"
решение2
Несколько более короткий вариант, чем у zumo.
find -iname "*.php" -exec grep -HP '.{6,}' {} \; | grep -P '^.+:[12]:'
где 6 — минимальное количество символов. Опция -H
— вывести имя файла, даже если grepping выполняется только для одного файла (это так, поскольку каждый найденный файл grepping выполняется отдельно с помощью оператора {}
)