サーバー上の最初の行または 2 行目に 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$'
- ファイルの 2 行目を取得し、文字数を数えます。
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
オプションは、1 つのファイルのみが grep された場合でもファイル名を出力します (これは、見つかったすべてのファイルが演算子によって個別に grep されるためです{}
)。