Unterschied zwischen grep -R (Großbuchstabe) und -r (Kleinbuchstabe)

Unterschied zwischen grep -R (Großbuchstabe) und -r (Kleinbuchstabe)

Wenn ich gehe /etc/apache2/und grep -rl 'LoadModule php' ./*dann eingebe, sehe ich nur ./mods-available/php7.0.load. Wenn ich rzu ändere R, sehe ich

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

Beides sind einfache Verzeichnisse. Ich würde erwarten, -rdass grep alle Dateien/Verzeichnisse im PWD rekursiv durchsucht. Was ist mit los ? Ich bin geneigt , an dieser Stelle -reinfach immer zu verwenden .-R

Antwort1

EntsprechendManpage von grep:

-r, --recursive
               Lesen Sie rekursiv alle Dateien in jedem Verzeichnis und folgen Sie dabei symbolischen Links nur, wenn sie sich in der Befehlszeile befinden. Beachten Sie, dass grep das Arbeitsverzeichnis durchsucht, wenn kein Dateioperand angegeben ist. Dies entspricht der Option -d recurse.

-R, --dereference-recursive
               Liest rekursiv alle Dateien in jedem Verzeichnis. Folgt allen symbolischen Links, anders als bei -r.

Beispiel:

Ich habe einen Ordnerprüfenin dem sich eine Datei befindet1.txt.2.txtist ein symbolischer Link zu1.txtsodass die Ausgabe wie ls -l testfolgt aussieht:

-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

Der Inhalt von1.txtIst:

This is a file.

Wenn ich suchen möchte nach"Datei"Zeichenfolge in Dateien innerhalbprüfenOrdner und ich führe aus:

grep "file" test

Es tritt ein Fehler auf:

grep: test: Is a directory

Aber wenn ich es mache:

grep -R "file" test

Ich bekomme eine Ausgabe:

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

Wenn ich andererseits ausführe:

grep -r "file" test

Ich erhalte die Ausgabe:

test/1.txt:This is a file

Hier habe ich nicht explizit erwähnt, dass alle Dateien gescannt werden sollen. Wenn ich also RFlag, symbolischen Link (hier2.txt) wurde beachtet und eine Ausgabe generiert. Aber als ich rflag verwendete, wurde der symbolische Link ignoriert, einfach weil ich nicht erwähnt hatte, dass gescannt werden soll2.txtAuch.

Antwort2

Von GNU grepv2.11-8 und höher,bei Aufruf mit-r schließt symbolische Links ausnicht in der Befehlszeile angegeben und schließt sie ein, wenn sie mit -R( aufgerufen werdenQuelle).

Ausman-Seite ( man grep):

-r, --recursive Lesen Sie alle Dateien in jedem Verzeichnis rekursiv und folgen Sie symbolischen Links nur, wenn sie sich in der Befehlszeile befinden. Beachten Sie, dass grep das Arbeitsverzeichnis durchsucht, wenn kein Dateioperand angegeben ist. Dies entspricht der Option -d recurse.

-R, --dereference-recursive Lesen Sie alle Dateien in jedem Verzeichnis rekursiv. Folgen Sie allen symbolischen Links,nicht wie-r.

verwandte Informationen