Como limitar o número de resultados de pesquisa por diretório

1

Como limitar o número de resultados de pesquisa por pasta, por exemplo:

Com este comando:

grep --include=*.php -Ril '<?' '/var/www/'

Eu recebo o seguinte:

/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

E preciso de apenas 3 resultados por pasta e, portanto, é:

/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
    
por Serg 30.11.2014 / 20:30

2 respostas

2

O grep recursivo varrerá a árvore inteira e não se importará com a estrutura do diretório. Você precisa percorrer a estrutura e grep cada diretório individualmente.

find /var/www -type d -print | while read dirname; do grep -sil '<?' "$dirname"/*.php | head -3; done

O grep -s lidará com condições em que não há arquivos php em um diretório.

    
por 30.11.2014 / 22:01
0

E algo assim?

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 lista todos os diretórios no diretório test , excluindo o pai.

find "$DIR" lista o caminho completo em cada diretório e depois consulta a extensão php e lista três com cabeçalho.

mkdir test
cd test
mkdir dir{test,1,anotherdir} && touch dir{test,1,anotherdir}/file{a,b,c,d,e,f}.php
cd ..

Saída:

./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
    
por 30.11.2014 / 21:35