![查找所有第一行或第二行字符数超过 N 个的 php 文件](https://linux22.com/image/1400465/%E6%9F%A5%E6%89%BE%E6%89%80%E6%9C%89%E7%AC%AC%E4%B8%80%E8%A1%8C%E6%88%96%E7%AC%AC%E4%BA%8C%E8%A1%8C%E5%AD%97%E7%AC%A6%E6%95%B0%E8%B6%85%E8%BF%87%20N%20%E4%B8%AA%E7%9A%84%20php%20%E6%96%87%E4%BB%B6.png)
我想在我的服务器上找出所有第一行或第二行包含超过 N 个字符的 php 文件。
我想打印文件名和找到的行内容。
我该怎么做?我正在考虑使用 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
比 zmo 稍短的版本
find -iname "*.php" -exec grep -HP '.{6,}' {} \; | grep -P '^.+:[12]:'
其中 6 是最小字符数。-H
即使只 grep 了一个文件,也可以打印文件名(这是因为每个找到的文件都是通过运算符单独 grep 的{}
)