Wie kann ich mit Silver Searcher suchen:
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"
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
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
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
-l
hinzu bzw. entfernen Sie es, je nachdem, ob die Textergebnisse den Text oder nur den Dateinamen anzeigen sollen[Bearbeiten: unnötige --smart-case-Flagge pro Kommentar von Pablo Bianchi entfernt]
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.
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.
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
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 $