it-swarm.com.de

Suchen Sie nach Dateien und Dateinamen mit Silver Searcher

Wie kann ich mit Silver Searcher suchen:

  1. (nicht binäre) Dateien mit einem Word oder MusterUND
  2. alle Dateinamen, mit einem Word oder Muster, einschließlich Dateinamen von Binärdateien.

Andere Präferenzen: Ich möchte die Groß-/Kleinschreibung und die Suche nach Dotfiles verwenden.


Ich habe versucht, einen Alias ​​ohne viel Glück zu verwenden:

alias search="ag -g $1 --smart-case --hidden && ag --smart-case --hidden $1"

22
Jikku Jose

Laut der Manpage von ag

   -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

Sie können die Option -G verwenden, um Suchen nach Dateien durchzuführen, die einem Muster entsprechen. 

Um Ihre Frage zu beantworten:

[email protected]:~/rpm-4.12.0.1# ag -G cpio.c size
rpm2cpio.c
21:    off_t payload_size;
73:    /* Retrieve payload size and compression type. */
76:     payload_size = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);

der obige Befehl sucht nach dem Wort size in allen Dateien, die dem Muster cpio.c entsprechen.

Referenz:
man-Seite von ag Version 0.28.0

Anmerkung 1:

Wenn Sie in bestimmten Dateitypen nach einem String suchen, beispielsweise alle C-Quellcodes, gibt es eine undokumentierte Funktion in ag, mit der Sie die Suche auf bestimmte Dateitypen schnell einschränken können.

Die folgenden Befehle suchen in allen PHP-Dateien nach foo:

find . -name \*.php -exec grep foo {}
ag --php foo

Während find + grep nach allen .php-Dateien sucht, sucht der --php-Schalter im Befehl ag tatsächlich nach den folgenden Dateierweiterungen:

.php  .phpt  .php3  .php4  .php5  .phtml

Sie können --cpp für C++ - Quelldateien, --hh für .h-Dateien, --js für JavaScript usw. verwenden. Eine vollständige Liste finden Sie hier

46
vincentleest

Versuchen Sie, dies zu Ihrer Aliase-Datei hinzuzufügen. Mit zsh getestet, sollte aber mit bash funktionieren. Das Problem, auf das Sie in Ihrem Beispiel gestoßen sind, ist, dass bash-Aliase keine Parameter übernehmen können. Daher müssen Sie zunächst eine Funktion definieren, die die Parameter verwendet, und dann der Funktion Ihren Alias ​​zuweisen.

searchfunction() {
  echo $(ag -g $1 --hidden)
  echo $(ag --hidden -l $1)
}

alias search=searchfunction

Sie können dieses Beispiel auf verschiedene Weise an Ihren Zweck anpassen, z

  • fügen Sie das Flag -l hinzu bzw. entfernen Sie es, je nachdem, ob die Textergebnisse den Text oder nur den Dateinamen anzeigen sollen
  • fügen Sie Überschriften hinzu, um Textergebnisse und Dateinamen zu trennen
  • deduplizieren Sie die Ergebnisse, um Dateien zu berücksichtigen, die mit Dateinamen, Text usw. übereinstimmen.

[Bearbeiten: unnötige --smart-case-Flagge pro Kommentar von Pablo Bianchi entfernt]

5
Greg

Ich habe diese Frage auf der Suche nach der gleichen Antwort selbst gefunden. Es scheint nicht so, als hätte ag native Funktionen, um Datei- und Verzeichnisnamen zu durchsuchen. Die obigen Antworten von Zach Fogg und Jikku Jose funktionieren beide, aber find . kann sehr langsam sein, wenn Sie in einem großen Verzeichnis arbeiten.

Ich würde empfehlen, find direkt zu verwenden, was viel schneller ist, als es durch ag zu leiten:

Linux (GNU-Version von find)

find -name [pattern]

OSX (BSD-Version von find)

find [pattern]

Wenn Sie weitere Hilfe zu find benötigen, ist dieser Leitfaden von Digital Ocean ziemlich gut. Ich füge das hinzu, weil die Manpages für find unverschämt dicht sind, wenn Sie nur die grundlegende Verwendung herausfinden möchten.

4
Greg

Versuche dies:

find . | ag "/.*SEARCHTERM[^/]*$"

Der Befehl find . listet alle Dateien auf.

Wir leiten die Ausgabe davon an den Befehl ag "/.*SEARCHTERM[^/]*$", der mit SEARCHTERM übereinstimmt, wenn er im Dateinamen steht, und nicht nur dem vollständigen Pfad.

4
Zachary Fogg

Um die vorherigen Antworten zu ergänzen, können Sie ein "oder" regulärer Ausdruck verwenden, um in Dateien zu suchen, die mit verschiedenen Dateierweiterungen übereinstimmen .

Zum Beispiel, um nur eine Zeichenfolge in C++ - Headerdateien [. Hpp ] und Makefiles [. Mk ]):

ag -G '.*\.(hpp|mk)' my_string_to_search

1
djondal

Nachdem ich mit mdfind, find, locate und anderen Versuchen unzufrieden war, funktionierte das Folgende für mich. Es verwendet tree, um die anfängliche Liste der Dateien abzurufen, ag, um Verzeichnisse herauszufiltern, und awk, um die passenden Dateien selbst auszudrucken.

Ich habe tree verwendet, weil es besser (und einfacher) konfigurierbar war als die anderen Lösungen, die ich ausprobiert habe, und es ist schnell.

Dies ist eine Fischfunktion:

function ff --description 'Find files matching given string'
  tree . --Prune --matchdirs -P "*$argv*" -I "webpack" -i -f --ignore-case -p |
    ag '\[[^d].*' |
    awk '{print $2}'
end

Dies ergibt eine Ausgabe ähnlich der folgenden:

~/temp/hello_world $ ff controller
./app/controllers/application_controller.rb
./config/initializers/application_controller_renderer.rb
~/temp/hello_world $
1
jchilders