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
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äkeminengrep -r foo *
-sivulla on, että kuorimaailma*
ei ' t laajenna piilotettuihin hakemistoihin / tiedostoihin, elleidotglob
ole asetettu parametrillashopt -s dotglob
. Yritägrep -r foo .
ja sinä ' näen, että piilotetut hakemistot kulkevat grepin kautta. Tai kokeileshopt -s dotglob
ja sittengrep -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
- Laina komentosi korvaaminen:
"$(pwd)"
Katso myös Miksi komentosarjan komentosarjani tukahduttaa välilyönnin tai muita erikoismerkkejä?
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" {} \+
grep
se tuottaa:grep: warning: recursive search of stdin