Postępując zgodnie z radą zawartą w tym pytaniu, mogę rekurencyjnie grepować ciąg znaków string w zawartości danego katalogu dir w następujący sposób

grep -r --exclude-dir=".*" string dir 

Jednak gdy zastosuję to do bieżącego katalogu, jako

$ grep -r --exclude-dir=".*" string . $ 

Nie otrzymuję żadnych wyników, ponieważ --exclude-dir=".*" pomija bieżący katalog jako ukryty, ponieważ pasuje do ".*".

Rozwiązaniem jest przejście do katalogu nadrzędnego przez cd .., a następnie uruchom polecenie na odpowiednim podrzędnym katalogu, a następnie cd ponownie z powrotem do tego oryginalnego katalogu roboczego. Musi istnieć jedno polecenie, którego mogę użyć, aby to zrobić bez obejścia zmiany katalogów.

Co to jest jedno polecenie do grep zawartości bieżącego katalogu, pomijając zawartość ukrytych katalogów?

Odpowiedź

Jeśli używasz GNU grep 2.11 lub nowszego, -r rozpocznie się od bieżącego katalogu, jeśli żaden katalog nie zostanie określony:

grep -r --exclude-dir=".*" string 

Komentarze

  • Dobrze zawiera informację o wersji. Z BSD grep daje: grep: warning: recursive search of stdin

Odpowiedź

W powłoce glob (znanej również jako wzorce nazw plików) . nie ma specjalnego znaczenia, * oznacza zero lub więcej znaków, a ? oznacza dowolny pojedynczy znak.

To, co chcesz wykluczyć, to kropka, po której następuje co najmniej jeden znak, a następnie dowolna liczba znaków. Użyj więc:

grep -r --exclude-dir=".?*" string . 

Odpowiedź

Ponieważ bash won „t grep domyślnie przechodzą przez ukryte katalogi (tj. bez dotglob włączonego:

$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo 

Po prostu wyklucz ukryte pliki:

$ grep --exclude=".*" -r foo * file:foo test/file:foo 

Komentarze

  • Jestem ciekawy, dlaczego nie skomentowano negatywnego głosu.
  • Nie ' nie głosowałem przeciw, ale ' nie jest prawdą, że grep nie ' przechodzą przez ukryte katalogi. Co ' ponownie widzimy z grep -r foo *, że shell glob * nie ' t rozwiń, aby uwzględnić ukryte katalogi / pliki, chyba że dotglob został ustawiony na shopt -s dotglob. Spróbuj z grep -r foo . a ty ' Zobaczmy, że ukryte katalogi przeszukiwane przez grep. Lub spróbuj z shopt -s dotglob, a następnie grep -r foo *.
  • Słuszna uwaga; Wyjaśniłem to w mojej odpowiedzi.
  • To nadal będzie przeszukiwać pliki w ukrytych katalogach zawartych w argumentach wiersza poleceń. To będzie trochę działać. W większości przypadków może to być w porządku, ale ' przypomina definiowanie " pi " jako " 3.1416 "; lepiej poznaj zastrzeżenia.

Odpowiedź

Możesz również określić bieżący katalog, używając $(pwd) like:

grep -r --exclude-dir=".*" string "$(pwd)" 

Komentarze

Odpowiedź

Aby powtórzyć w pojedynczym katalog (nie ograniczając ukrytych plików pod-diredtories) użyj:

Ponieważ echo dir/* wypisze wszystkie pliki w katalogu, to zadziała dla plików znajdujących się w jakimś katalogu:

$ grep -r "string" $(echo dir/*) 

po prostu zmień dir na . (kropka) i otrzymasz dokładnie to, czego chcesz:

$ grep -r "string" $(echo ./*) 

Jeśli nie potrzebujesz żadnych ukrytych plików w żadnym z podkatalogów, użyj:

$ grep -r --exclude-dir=".*" "string" 

Lub użyj find:

find . -not -path "*/\.*" -type f -exec grep "string" {} \+ 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *