Może przeszukiwać tylko pliki pasujące do określonego wzorca „glob” (np. Wyszukaj foo we wszystkich plikach o nazwie „bar * .c”). Komenda
ack foo "bar*.c"
działa tylko w bieżącym katalogu.
Uwaga: Wiem, że jest to możliwe dzięki find -exec:
find . -name "bar*.c" -type f -exec ack foo {} +
Ale chciałbym małe i proste polecenie ack, ponieważ find nie pomija katalogów kontroli wersji.
find . -name "bar*.c" -exec ack foo {} \;
? Nie ma w tym nic specjalnegogrep
, możesz użyć dowolnego polecenia z find's-exec
.Odpowiedzi:
Wyszukiwanie katalogów
Na podstawie streszczenia pokazanego na stronie podręcznika powiedziałbym, że tak, może przetworzyć katalog, ale patrząc na przełączniki, nie może poszukać tylko pliku opartego na wzorcu. W tym celu musisz się zaciągnąć
find
. Polecenieack
zawiera opcję,--files-from=FILE
dzięki czemu można podać listę plików zfind
.streszczenie
stosowanie
Istnieje
--ignore-file=
opcja, która może dać ci to, czego chcesz, ale wydaje się trochę trudna w użyciu.Wyszukiwanie określonych typów plików
Jedynym innym sposobem, w jaki mogę to zrobić,
ack
jest użycie jego--type
przełącznika:Aby zobaczyć, jakie typy są dostępne:
format. Na przykład działają zarówno --type = perl, jak i --perl. - [no] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [no] objcpp .mm .h - [no] perl .pl .pm .pod .t .psgi; dopasowanie do pierwszego wiersza /^#!.*\bperl/ - [no] perltest .t
Przykłady
Znajdź wszystkie pliki Perla na podstawie nazwy pliku (* .pm, * .pl, * .t i * .pod) oraz linii shebang.
Znajdź wszystkie pliki C ++:
Wyszukiwanie foo w barze * .c
Więc jak możesz osiągnąć to, czego chcesz? Cóż, prawdopodobnie będziesz musiał
find
to zrobić:Możesz także skorzystać
ack
ze zdolności wyszukiwania plików, które pasują do danego wzorca w nazwach plików (using-g <pattern>
), a następnie przekaż tę listę do drugiego wywołaniaack
using-x
lub--files-from=-
…Używanie
-x
:Używanie
-files-from=-
:W obu przypadkach dopasowujemy nazwy plików, których chcesz użyć za pomocą tego wyrażenia regularnego:
Dopasowuje pliki, których nazwa jest
bar.*c
i koniec po.c
użyciu końcu linii kotwicy$
. Staramy się również upewnić, że nazwy mają znak graniczny przy użyciu\b
. Nie powiedzie się to dla plików zawierających znaki graniczne, takie jak$bar.c
lub%bar.c
na przykład.źródło
cpp
plikiack --type=cpp <string>
. Więcejack
informacji na ten temat można znaleźć na stronie podręcznika użytkownika. Ale w zasadzie mówię ci, że nie możesz wyszukiwaćack
w sposób, w jaki chcesz.ack
może zrobić tego, o co został poproszony.find adir -iname "bar*.c" | ack --files-from=- foo
. Lub, jeśli chcesz tylko jeden plik:echo "barBaz.c" | ack --files-from=- foo
ack -g '\bbar.*.c$' | ack -x foo
Łatwo jest, jeśli typ pliku jest znany, a ack zna wiele typów plików. Jeśli na przykład chcesz wyszukiwać tylko w plikach C, możesz:
Ale jeśli nie jest to jedno ze znanych rozszerzeń, musisz zdefiniować własny typ. To powinno działać:
Pamiętaj, że potrzebujesz zarówno --type-set, jak i --barc.
(Dzięki Andy, który również pomógł w tym na liście mailingowej).
źródło
man ack
tak naprawdę nie pomaga i nie ma,cc
kiedy tego szukam.„Co nowego w ack 2?” http://beyondgrep.com/ack-2.0/
Tylko że nie mogę go uruchomić:
Wydaje się więc, że -g potrzebuje wyrażenia regularnego, a ja chcę opcję stylu globalnego ...
źródło
-g
wymaga wyrażenia regularnego, a nie globalnego. Możesz napisać swoje wyrażenie regularne jako.*bar.*\.c$
.Wydawałoby się to najszybszym i najbezpieczniejszym:
-x Przeczytaj listę plików do wyszukiwania ze STDIN.
Jeśli jednak plik prawdopodobnie znajduje się w
locate
bazie danych, byłoby to jeszcze szybsze:Locate może również przyjmować wyrażenia regularne ze starej szkoły, co jest nieco bolesne, ale jeśli szukasz
c
plików, może być konieczne. na przykładTo po prostu przekłada się na: „wyszukaj całą nazwę pliku, która kończy się na c, cpp, h, hpp lub cc”.
źródło
Ack nie obsługuje wyboru plików w stylu globalnym. Ponieważ naprawdę mi tego brakuje, stworzyłem mały skrypt powłoki shellg :
Teraz możesz użyć polecenia:
Ale uwaga: to niestety przeszuka także katalog kontroli wersji (np. .Git).
źródło
Można to zrobić za pomocą
-G
opcji ag, srebrnego wyszukiwarki (ulepszony klon ack-grep).Uwagi:
ag
używa składni wyrażeń regularnych PCRE , więc wyrażenie regularne musi byćbar.*\.c
zamiastbar*.c
.-G
opcja musi poprzedzać wyszukiwane hasło, ponieważ wszystko później interpretowane jest jako nazwa pliku.źródło
Czy chcesz tylko określony wzorzec, czy tylko pliki źródłowe w C?
Jeśli chcesz wszystkie pliki C., użyj
Jeśli chcesz używać wszystkich plików C i NIE plików nagłówka C.
źródło
Odpowiedź @chim jest najlepsza, ale jest napisana jako komentarz, więc przesyłam jako oficjalną odpowiedź ...
Podoba mi się to, że możesz regexować ścieżkę ...
źródło
Używając zsh możesz:
źródło
ls
.