Grep, zignoruj ​​ostrzeżenia


50

Próbuję znaleźć katalog instalacyjny określonego pakietu. Mam określone słowo kluczowe, za pomocą którego próbuję znaleźć określony plik.

Podczas grep chcę tylko dołączyć typ pliku cpp lub h . Nie chcę, aby grep wyświetlał ostrzeżenia, takie jak Odmowa dostępu lub Nie można znaleźć katalogu . Chcę tylko, żeby wyświetlał dopasowane pliki, nic więcej. Proszę zasugerować, jak mogę to zrobić?

Obecnie używam

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Odpowiedzi:


56

Ostrzeżenia te są kierowane do stderrstrumienia, w przeciwieństwie do standardowego deskryptora plików wyjściowych. Możesz wyciszyć wyjście stderr, dodając 2>/dev/nullna końcu polecenia.


find . 2>/dev/null | grep 404.html
Mówiąc

30

Bardziej bezpośrednio niż filtrowanie ostrzeżeń można je wyłączyć, dodając -s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Istnieją pewne problemy ze zgodnością z tą opcją. Nie powinno to jednak stanowić problemu do użytku osobistego.

-s, --no-messages: Pomija komunikaty o błędach dotyczące nieistniejących lub nieczytelnych plików. Uwaga dotycząca przenośności: w przeciwieństwie do GNU grep, grep uniksowy 7. edycji nie był zgodny z POSIX, ponieważ brakowało w nim opcji -q, a opcja -s zachowywała się jak opcja -q GNU grep. Grep w stylu USG również nie miał opcji -q, ale jego opcja -s zachowywała się tak jak GNU grep. Przenośne skrypty powłoki powinny unikać zarówno -q, jak i -s, a zamiast tego powinny przekierowywać standardowe i błędne dane wyjściowe do / dev / null. (-s jest określone przez POSIX).


Właśnie zainstalowałem 13.04 i otrzymuję błędy, których nie otrzymałem z 12.04. Czy to możliwe, że coś się zmieniło? Pomyślałem, że fajnie jest, żeby grep przestał ostrzegać o plikach będących katalogami, ponieważ w większości przypadków po prostu mnie to nie obchodzi!
Alexis Wilke,

Przepraszamy, wciąż mam 12.10, więc nie mogę tego potwierdzić.
Sebastian vom Meer

5

Zwykle otrzymywałem mnóstwo irytujących wiadomości:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

Powodem jest to, że --directoriesflaga jest domyślnie ustawiona na read. Zmieniłem to na recurse; jeśli nie chcesz, aby automatycznie przeprowadzało wyszukiwanie rekurencyjne, możesz skipzamiast tego użyć .

Najłatwiejszym sposobem radzenia sobie z tym przez cały czas jest ustawienie jej w zmiennej środowiskowej. W ~/.bash_profilelub ~/.bashrcw zależności od dystrybucji:

export GREP_OPTIONS='--directories=recurse'

Teraz automatycznie pomija te wiadomości za każdym razem, gdy używam grep.

Inną opcją jest --no-messagesflaga, skrót -s. Spowoduje to również pozbycie się Is a directorywiadomości, ale także pominie inne wiadomości, które mogą być bardziej przydatne. Na przykład, jeśli przeprowadzasz wyszukiwanie zagnieżdżone */*/*i nie istnieje taki plik tego wzorca, to ci to nie powie.


dobry explanaition
aldr

1

Alternatywnym podejściem zamiast robić greprekurencyjnie -ir byłoby pozwolenie findkomendzie (która domyślnie jest rekurencyjna) obsługiwać uprawnienia z -readableflagą i ścieżkami do wykluczenia z -not -path "*.svn*"flagami, a następnie przekazać plik do grep. Wykluczanie katalogów odbywa się poprzez -type fwyszukiwanie tylko zwykłych plików.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.