如何限制每个目录的搜索结果数量

如何限制每个目录的搜索结果数量

如何限制每个文件夹的搜索结果数量,例如:

使用此命令:

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 dtest列出目录中不包括父目录的所有目录。

find "$DIR"列出每个目录中的完整路径,然后 grep 查找 php 扩展名并列出三个带 head 的路径。

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

相关内容