フォルダごとの検索結果の数を制限する方法は次のとおりです。例:
次のコマンドを使用します。
grep --include=*.php -Ril '<?' '/var/www/'
次のメッセージが表示されます。
/var/www/test.php
/var/www/test1.php
/var/www/phpinfo1.php
/var/www/phpinfoo.php
/var/www/phpinfooo.php
/var/www/1/php.php
/var/www/1/php3.php
/var/www/1/index.php
/var/www/1/indexed.php
/var/www/1/indexin.php
/var/www/test/tester.php
/var/www/test/info.php
/var/www/test/inform.php
/var/www/test/conf.php
フォルダごとに3つの結果のみが必要なので、次のようになります。
/var/www/test.php
/var/www/test1.php
/var/www/phpinfo1.php
/var/www/1/php.php
/var/www/1/php3.php
/var/www/1/index.php
/var/www/test/tester.php
/var/www/test/info.php
/var/www/test/inform.php
答え1
再帰 grep は、ディレクトリ構造に関係なくツリー全体を検索します。構造を繰り返し、各ディレクトリを個別にgrepする必要があります。
find /var/www -type d -print | while read dirname; do grep -sil '<?' "$dirname"/*.php | head -3; done
grep -s
ディレクトリにPHPファイルがない場合を処理します。
答え2
このようなことがある場合はどうすればよいですか?
for DIR in $( find ./test -mindepth 1 -type d ); do
find "$DIR" -type f | grep "\.php" | head -n3
done
find ./test -mindepth 1 -type d
test
親ディレクトリを除くディレクトリ内のすべてのディレクトリを一覧表示します。
find "$DIR"
各ディレクトリのフルパスをリストし、php拡張子をgrepし、headを使用して3つのパスをリストします。
mkdir test
cd test
mkdir dir{test,1,anotherdir} && touch dir{test,1,anotherdir}/file{a,b,c,d,e,f}.php
cd ..
出力:
./test/dirtest/filed.php
./test/dirtest/filec.php
./test/dirtest/filee.php
./test/dir1/filed.php
./test/dir1/filec.php
./test/dir1/filee.php
./test/diranotherdir/filed.php
./test/diranotherdir/filec.php
./test/diranotherdir/filee.php