Wie kann ich versteckte Dateien durchsuchen?

96

Ich suche in einem Git-Repository und möchte den .gitOrdner einschließen .

grep enthält diesen Ordner nicht, wenn ich laufe

grep -r search *

Was wäre ein grep-Befehl, um diesen Ordner einzuschließen?

Steven Penny
quelle

Antworten:

135

Bitte beziehen Sie sich auf die Lösung am Ende dieses Beitrags als bessere Alternative zu dem, was Sie tun.

Sie können versteckte Dateien explizit einschließen (ein Verzeichnis ist auch eine Datei).

grep -r search * .*

Das *passt zu allen Dateien außer den versteckten und .*nur zu den versteckten Dateien. Dies schlägt jedoch fehl, wenn sich entweder keine nicht versteckten Dateien oder keine versteckten Dateien in einem bestimmten Verzeichnis befinden. Sie können natürlich explizit .gitanstelle von hinzufügen .*.

Wenn Sie jedoch einfach in einem bestimmten Verzeichnis suchen möchten, gehen Sie folgendermaßen vor:

grep -r search .

Das entspricht .dem aktuellen Pfad, der sowohl nicht versteckte als auch versteckte Dateien enthält.

Bitmaske
quelle
1
Der erste Ansatz (grep -r search *. *) Hat bei mir funktioniert. Der zweite Ansatz (grep -r search.) Hat die Zeichenfolge nicht gefunden. Ich habe ähnliche Ergebnisse gefunden, als ich das "-r" weggelassen und nur das Verzeichnis der obersten Ebene durchsucht habe. Ich benutze GNU grep 2.6.3.
Alan
@ Alan: Das ist komisch. Ich benutze das regelmäßig. Haben Sie es im selben Verzeichnis versucht?
Bitmaske
27
using .*wird das übergeordnete Verzeichnis enthalten (weil ..Übereinstimmungen)
sehe
1
Ist es sicher, diese Lösung zu verallgemeinern, da das Verhalten zwischen den Schalen variieren kann?
Astletron
6
Für die erste Version sollten Sie --exclude-dir = .. hinzufügen, um die Suche in den übergeordneten Ordnern zu vermeiden
user762353
11

Ich bin gerade auf dieses Problem gestoßen. Basierend auf der Antwort von @ bitmask ist hier meine einfache Änderung, um das von @sehe aufgezeigte Problem zu vermeiden:

grep -r search_string * .[^.]*
Wahnsinniger
quelle
Ich bekomme keine Ergebnisse damit: sudo grep -r ANDROID_HOME * .[^.]*Was mache ich hier falsch?
Messerschnabel
@messerbill wo läufst du?
Insaner
3

Vielleicht bevorzugen Sie es, "grep" mit dem Befehl "find" zu kombinieren, um eine vollständige Lösung wie:

find . -exec grep -Hn search {} \;

Dieser Befehl durchsucht versteckte Dateien oder Verzeichnisse nach der Zeichenfolge "Suche" und listet alle Dateien auf, die mit diesem Ausgabeformat übereinstimmen:

Dateipfad: Zeilennummer: Zeile mit Zufall

./foo/bar:42:search line
./foo/.bar:42:search line
./.foo/bar:42:search line
./.foo/.bar:42:search line
Olvathar
quelle
2

Möglicherweise möchten Sie diesen Ansatz verwenden, vorausgesetzt, Sie durchsuchen das aktuelle Verzeichnis (andernfalls ersetzen Sie es durch das gewünschte Verzeichnis):

find . -type f | xargs grep search

oder wenn Sie nur auf der obersten Ebene suchen möchten (was schneller zu testen ist, wenn Sie diese ausprobieren):

find . -type f -maxdepth 1 | xargs grep search

UPDATE: Ich habe die Beispiele als Reaktion auf Scotts Kommentare geändert. Ich habe auch "-type f" hinzugefügt.

Alan
quelle
1
(1)  ~ist das Home-Verzeichnis des Benutzers. Die Frage bezog sich nicht auf das Home-Verzeichnis des Benutzers, daher sollte die Antwort nicht erwähnt werden  ~. (2) In einem  findBefehl -name '*'ist ein No-Op (dh es hat keinen Zweck).
Scott
1

So suchen Sie NUR alle versteckten Dateien und Verzeichnisse von Ihrem aktuellen Standort aus:

find . -name ".*" -exec grep -rs search {} \;

NUR alle versteckten Dateien:

find . -name ".*" -type f -exec grep -s search {} \;

NUR alle versteckten Verzeichnisse:

find . -name ".*" -type d -exec grep -rs search {} \;
Tyler Christian
quelle
1

Alle anderen Antworten sind besser. Dieser könnte leicht zu merken sein:

find . -type f | xargs grep search

Es werden nur Dateien (einschließlich versteckter) gefunden und jede Datei erfasst.

PrashantB
quelle
0

So finden Sie nur in einem bestimmten Ordner:

ls -al | grep " \."

Es ist ein sehr einfacher Befehl zum Auflisten und Weiterleiten an grep.

Peter Mortensen
quelle
0

Zusätzlich zu Tylers Vorschlag ist hier der Befehl, alle Dateien und Ordner einschließlich versteckter Dateien rekursiv zu erfassen

find . -name "*.*" -exec grep -li 'search' {} \;
nikhilgoel1985
quelle
0

Um zu verhindern , Matching .und ..die Dateien nicht ausgeblendet sind, können Sie grepmit , ls -Awie in diesem Beispiel:

ls -A | grep "^\."

^\. gibt an, dass das erste Zeichen sein muss .

Die -Aoder --almost-allOption schließt die Ergebnisse .und ..damit nur versteckte Dateien und Verzeichnisse abgestimmt sind.

mchid
quelle
0

Sie können auch nach bestimmten Arten von versteckten Dateien suchen, z. B. nach versteckten Verzeichnisdateien:

grep -r --include=*.directory "search-string"

Dies funktioniert möglicherweise besser als einige der anderen Optionen. Die anderen Optionen, die funktionierten, können zu langsam sein.

mYnDstrEAm
quelle