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
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 zgrep -r foo *
, że shell glob*
nie ' t rozwiń, aby uwzględnić ukryte katalogi / pliki, chyba żedotglob
został ustawiony nashopt -s dotglob
. Spróbuj zgrep -r foo .
a ty ' Zobaczmy, że ukryte katalogi są przeszukiwane przez grep. Lub spróbuj zshopt -s dotglob
, a następniegrep -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
- Cytuj podstawienie polecenia:
"$(pwd)"
Zobacz także Dlaczego mój skrypt powłoki dławi się białymi spacjami lub innymi znakami specjalnymi?
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" {} \+
grep
daje:grep: warning: recursive search of stdin