Diferença entre grep -R (maiúsculas) e -r (minúsculas)

Diferença entre grep -R (maiúsculas) e -r (minúsculas)

Se eu entrar /etc/apache2/e digitar grep -rl 'LoadModule php' ./*, só verei ./mods-available/php7.0.load. Se eu mudar rpara Rentão verei

./mods-available/php7.0.load
./mods-enabled/php7.0.load

Ambos são diretórios simples. Eu esperaria -rfazer com que o grep recorresse a todos os arquivos/diretórios no PWD. O que está acontecendo -r? Estou pensando em usar sempre -Rneste momento.

Responder1

De acordo compágina de manual do grep:

-r, --recursivo
               Leia todos os arquivos em cada diretório, recursivamente, seguindo links simbólicos somente se eles estiverem na linha de comando. Observe que se nenhum operando de arquivo for fornecido, o grep pesquisa o diretório de trabalho. Isso é equivalente à opção -d recurse.

-R, --dereferência-recursiva
               Leia todos os arquivos em cada diretório, recursivamente. Siga todos os links simbólicos, ao contrário de -r.

Exemplo:

Eu tenho uma pastatesteem que há um arquivo1.txt.2.txté um link simbólico para1.txttal que a saída de ls -l testse pareça com:

-rw-r--r-- 1 kulfy kulfy 15 Jun 12 21:53 1.txt
lrwxrwxrwx 1 kulfy kulfy  5 Jun 12 21:53 2.txt -> 1.txt

O conteúdo de1.txté:

This is a file.

Se eu quiser pesquisar"arquivo"string em arquivos dentrotestepasta e eu corro:

grep "file" test

Encontrarei um erro:

grep: test: Is a directory

Mas se eu fizer:

grep -R "file" test

Eu recebo uma saída:

test/2.txt:This is a file
test/1.txt:This is a file

Por outro lado, se eu executar:

grep -r "file" test

Eu recebo a saída:

test/1.txt:This is a file

Aqui, não mencionei explicitamente a verificação de todos os arquivos. Então, quando usei Rflag, link simbólico (aqui2.txt) foi respeitado e o resultado foi gerado. Mas quando usei ro sinalizador, o link simbólico foi ignorado simplesmente porque não mencionei a verificação2.txttambém.

Responder2

Do GNU grepv2.11-8 e superior,se invocado com-r exclui links simbólicosnão especificado na linha de comando e os inclui quando invocados com -R(fonte).

Depágina de manual ( man grep):

-r, --recursive Leia todos os arquivos em cada diretório, recursivamente, seguindo links simbólicos apenas se eles estiverem na linha de comando. Observe que se nenhum operando de arquivo for fornecido, o grep pesquisa o diretório de trabalho. Isso é equivalente à opção -d recurse.

-R, --dereference-recursive Leia todos os arquivos em cada diretório, recursivamente. Siga todos os links simbólicos,diferente-r.

informação relacionada