Jak wyszukiwać z maksymalną głębokością w ack i grep?

32

Czy istnieje sposób, aby nakazać ackwyszukiwanie tylko tekstu w bieżącym folderze? (lub podać max-depthpoziom?) Oraz za pomocą grep?

Amelio Vazquez-Reina
źródło
1
Nie, ack nie ma opcji maksymalnej głębokości, poza tym, -nże w ogóle się nie powtórzy.
Andy Lester

Odpowiedzi:

22

Użyj -ndo no-recurse:

$ ack -n foo

grepdomyślnie nie jest rekurencyjny i powinieneś używać -rflagi tylko wtedy, gdy chcesz wyszukiwać rekurencyjnie.

Możesz przeszukać bieżący katalog grepw następujący sposób:

$ grep -- foo *
Eric Wilson
źródło
13
Nie odpowiada na pytanie? (co jeśli chcę wrócić na głębokość 2)
Steven Lu
Dobra uwaga, że ​​mi tego brakowało. Jakieś sugestie?
Eric Wilson,
29

Możesz połączyć find z argumentem -exec. przykład:

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

Można to skalować, tj -maxdepth 2

David Wilkins
źródło
Stephane, moja odpowiedź ( -maxdepth 1) była skalowalna. Na przykład -maxdepth 2. Nie wiem, jak opisać dokonaną przez ciebie edycję.
David Wilkins
nie osiągnie @stephane, jeśli nie użyjesz @.
Braiam
4
Tak, przepraszam, zgadzam się, że moja edycja była zbyt nachalna. Nadal możesz wyjaśnić, że ta ( -maxdepth) nie jest przenośną / standardową składnią (tylko GNU i niektóre BSD). Ponadto nie ma sensu używać \;tutaj (uruchom jeden grepna plik). Użyj grep -H foo {} +(specyficzne dla GNU) lub grep foo /dev/null {} +(standardowe), aby upewnić się, że nazwa pliku jest zawsze drukowana. Standardowym odpowiednikiem -maxdepth 2byłobyfind . -path './*/*' -type d -prune -o -type f -exec ...
Stéphane Chazelas
2
Zauważ też, że twoje dadzą komunikaty o błędach dla katalogów (w tym, .ponieważ nie dajesz tego -mindepth 1), podczas gdy GNU grepnie będzie próbowało czytać katalogów -r(to się na nich powtarza ). Może chcesz dodać -d skipdo grep(zakładając GNU grep) lub lepiej dodać ! -type ddo findlub nawet lepiej -type f(lub -xtype fzakładając GNU find) jak pewnie nie chce grepczytać non-zwykłe pliki.
Stéphane Chazelas
4
Zwykle używam grep -Hintego podejścia, dzięki czemu mogę zobaczyć nazwę pliku i linię, na której jest wystąpienie.
PKB2 11.04.16