Diferencia entre grep -R (mayúscula) y -r (minúscula)

Diferencia entre grep -R (mayúscula) y -r (minúscula)

Si entro /etc/apache2/y escribo grep -rl 'LoadModule php' ./*, solo veré ./mods-available/php7.0.load. Si cambio ra Rentonces veré

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

Ambos son directorios simples. Esperaría -rque grep recurra a todos los archivos/directorios en el PWD. ¿Qué está pasando con -r? Estoy pensando en usarlo siempre -Ren este punto.

Respuesta1

De acuerdo apágina de manual de grep:

-r, --recursivo
               Lea todos los archivos en cada directorio, de forma recursiva, siguiendo enlaces simbólicos solo si están en la línea de comando. Tenga en cuenta que si no se proporciona ningún operando de archivo, grep busca en el directorio de trabajo. Esto es equivalente a la opción -d recursiva.

-R, --desreferencia-recursiva
               Lea todos los archivos de cada directorio de forma recursiva. Siga todos los enlaces simbólicos, a diferencia de -r.

Ejemplo:

tengo una carpetapruebaen el que hay un archivo1.texto.2.textoes un enlace simbólico a1.textotal que la salida de ls -l testse parece a:

-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

El contenido de1.textoes:

This is a file.

Si quiero buscar"archivo"cadena en archivos dentropruebacarpeta y ejecuto:

grep "file" test

Me encontraré con un error:

grep: test: Is a directory

Pero si lo hago:

grep -R "file" test

Obtengo una salida:

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

Por otro lado si ejecuto:

grep -r "file" test

Obtengo salida:

test/1.txt:This is a file

Aquí, no he mencionado explícitamente escanear todos los archivos. Entonces, cuando usé Rbandera, enlace simbólico (aquí2.texto) se respetó y se generaron resultados. Pero cuando usé rla bandera, el enlace simbólico fue ignorado simplemente porque no mencioné escanear.2.textotambién.

Respuesta2

De GNU grepv2.11-8 y superiores,si se invoca con-r excluye enlaces simbólicosno especificado en la línea de comando y los incluye cuando se invoca con -R(fuente).

Depágina del manual ( man grep):

-r, --recursive Lea todos los archivos en cada directorio, de forma recursiva, siguiendo enlaces simbólicos solo si están en la línea de comando. Tenga en cuenta que si no se proporciona ningún operando de archivo, grep busca en el directorio de trabajo. Esto es equivalente a la opción -d recursiva.

-R, --dereference-recursive Lea todos los archivos de cada directorio de forma recursiva. Siga todos los enlaces simbólicos,a diferencia de-r.

información relacionada