Wie kann ich in ack und grep eine Suche mit maximaler Tiefe durchführen?

32

Kann ich festlegen ack, dass nur im aktuellen Ordner nach Text gesucht wird? (oder ein max-depthLevel angeben ?) Und mit grep?

Amelio Vazquez-Reina
quelle
1
Nein, ack hat keine Option für die maximale Tiefe, -nmit Ausnahme der Option, überhaupt nicht zurückzugreifen.
Andy Lester

Antworten:

22

Verwenden Sie -nfür no-recurse:

$ ack -n foo

grep ist standardmäßig nicht rekursiv und Sie sollten das -r Flag nur verwenden, wenn Sie eine rekursive Suche wünschen.

Sie können das aktuelle Verzeichnis grepfolgendermaßen durchsuchen :

$ grep -- foo *
Eric Wilson
quelle
13
Beantwortet die Frage nicht? (Was ist, wenn ich auf eine Tiefe von 2 zurückgreifen möchte)
Steven Lu
Guter Punkt, das habe ich verpasst. Irgendwelche Vorschläge?
Eric Wilson
29

Sie können find mit dem Argument -exec koppeln. Beispiel:

find . -maxdepth 1 -exec grep foo {} \;

Dies kann skaliert werden, dh -maxdepth 2

David Wilkins
quelle
Stephane, meine Antwort ( -maxdepth 1) war skalierbar. Zum Beispiel -maxdepth 2. Ich weiß nicht, wie ich die von Ihnen vorgenommene Bearbeitung beschreiben soll.
David Wilkins
es wird @stephane nicht erreichen, wenn Sie das @ nicht verwenden.
Braiam
4
Ja, leider stimme ich zu, dass meine Bearbeitung zu aufdringlich war. Vielleicht möchten Sie noch klarstellen, dass that ( -maxdepth) keine portable / Standard-Syntax ist (nur GNU und einige BSDs). Außerdem hat die Verwendung \;hier keinen Sinn (eine greppro Datei ausführen ). Verwenden Sie grep -H foo {} +(GNU-spezifisch) oder grep foo /dev/null {} +(Standard), um sicherzustellen, dass der Dateiname immer gedruckt wird. Das Standardäquivalent zu -maxdepth 2wärefind . -path './*/*' -type d -prune -o -type f -exec ...
Stéphane Chazelas
2
Beachten Sie auch, dass Ihre Fehlermeldungen für Verzeichnisse (einschließlich der, .die Sie nicht geben -mindepth 1) geben, während GNU grepnicht versucht, Verzeichnisse mit zu lesen -r(es rekursiert auf ihnen). Möglicherweise möchten Sie eine hinzufügen , -d skipum grep(unter der Annahme GNU grep) oder besser hinzufügen ! -type dzu findoder noch besser -type f(oder -xtype fGNU vorausgesetzt find) , wie Sie wahrscheinlich nicht wollen , grepnicht reguläre Dateien lesen.
Stéphane Chazelas
4
Ich neige dazu, grep -Hindiesen Ansatz zu verwenden, damit ich den Dateinamen und die Zeile sehen kann, in der sich das Vorkommen befindet.
GDP2