Seuraamalla tämän kysymyksen alla olevia ohjeita voin rekursiivisesti hakea merkkijonoa string tietyn hakemiston sisällössä dir seuraavasti

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

Kuitenkin, kun käytän tätä nykyiseen hakemistoon,

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

En saa tuloksia, koska --exclude-dir=".*" -vaihtoehto jättää nykyisen hakemiston piilotetuksi, koska se vastaa ".*".

Kiertotapa on vaihtaa päähakemistoon cd .., suorita sitten komento sopivalla lapsella ja sitten cd uudelleen takaisin alkuperäiseen työkansioon. Tarvitaan yksi komento, jota voin tehdä tässä ilman hakemistojen vaihtamista.

Mikä on yksi komento sisällön hakemiseen jättää piilotettujen hakemistojen sisältö pois?

Vastaa

Jos käytät GNU grep 2.11: ää tai uudempaa, -r alkaa nykyisestä hakemistosta, jos hakemistoa ei ole määritetty:

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

Kommentit

  • Hyvä sisällyttää versiohuomautus. BSD: llä grep se tuottaa: grep: warning: recursive search of stdin

vastaus

Kuoripallossa (tunnetaan myös nimellä tiedostonimen mallit) . ei ole mitään erityistä merkitystä, * tarkoittaa nollaa tai useampaa merkkiä ja ? tarkoittaa mitä tahansa yksittäistä merkkiä.

Poissuljettava on piste, jota seuraa vähintään yksi merkki ja sitten mikä tahansa määrä merkkejä. Joten käytä:

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

Vastaa

Koska bash ei ole grep kulkenut oletuksena piilotettuja hakemistoja (ts. ilman dotglob käytössä:

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

Sulje vain piilotetut tiedostot:

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

kommentit

  • Olen utelias kommentoimattoman alasääntöjen taustalla.
  • En ' ei äänestänyt alas, mutta se ' s ei pidä paikkaansa, että grep ei ' t kulkee piilotettujen hakemistojen läpi. Mitä ' Uudelleen näkeminen grep -r foo * -sivulla on, että kuorimaailma * ei ' t laajenna piilotettuihin hakemistoihin / tiedostoihin, ellei dotglob ole asetettu parametrilla shopt -s dotglob. Yritä grep -r foo . ja sinä ' näen, että piilotetut hakemistot kulkevat grepin kautta. Tai kokeile shopt -s dotglob ja sitten grep -r foo *.
  • Kohtuullinen piste; Olen selventänyt tätä vastauksessani.
  • Tämä etsii edelleen tiedostoja piilotetuista hakemistoista, jotka sisältyvät komentoriviargumentteihin. Se toimii tavallaan . Useimmissa tapauksissa se saattaa olla kunnossa, mutta se ' haluaa määritellä " pi " nimellä " 3.1416 "; tiedät paremmin varoitukset.

Vastaa

Voit määrittää nykyisen hakemiston myös käyttämällä $(pwd) kuten:

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

Kommentit

vastaus

Toistuminen yksittäisen -hakemiston (joka ei rajoita piilotettujen tiedostojen alihakemistot) käyttöä:

Koska echo dir/* tulostaa kaikki tiedostot dir-levyn sisällä, tämä toimii joidenkin hakemistojen sisällä:

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

muuta vain dir muotoon . (piste) ja saat täsmälleen haluamasi:

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

Jos et tarvitse piilotettuja tiedostoja missään alihakemistossa, käytä joko:

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

Tai käytä hakua:

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *