如何限制每个文件夹的搜索结果数量,例如:
使用此命令:
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"
列出每个目录中的完整路径,然后 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