Wenn ich gehe /etc/apache2/
und grep -rl 'LoadModule php' ./*
dann eingebe, sehe ich nur ./mods-available/php7.0.load
. Wenn ich r
zu ändere R
, sehe ich
./mods-available/php7.0.load
./mods-enabled/php7.0.load
Beides sind einfache Verzeichnisse. Ich würde erwarten, -r
dass grep alle Dateien/Verzeichnisse im PWD rekursiv durchsucht. Was ist mit los ? Ich bin geneigt , an dieser Stelle -r
einfach 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 test
folgt 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 R
Flag, symbolischen Link (hier2.txt) wurde beachtet und eine Ausgabe generiert. Aber als ich r
flag 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).
-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
.