Etter rådene under dette spørsmålet, er jeg i stand til å rekursivt gripe etter en streng string
i innholdet i en gitt katalog dir
som følger
grep -r --exclude-dir=".*" string dir
Når jeg bruker dette på den nåværende katalogen, som
$ grep -r --exclude-dir=".*" string . $
, får jeg ingen resultater siden --exclude-dir=".*"
alternativet utelater gjeldende katalog som skjult siden den samsvarer med ".*"
.
En løsning er å bytte til overordnet katalog via cd ..
, kjør deretter kommandoen på det aktuelle barnet, og cd
igjen i den opprinnelige arbeidskatalogen. Det må være en enkelt kommando som jeg kan bruke til å gjøre dette uten å gjøre noe med å endre kataloger.
Hva er en enkelt kommando for å grep innholdet i den nåværende katalogen, utelater du innholdet i skjulte kataloger?
Svar
Hvis du bruker GNU grep 2.11 eller nyere, starter -r
fra den aktuelle katalogen hvis ingen katalog er spesifisert:
grep -r --exclude-dir=".*" string
Kommentarer
Svar
I shell glob (også kjent som filnavnmønstre) har .
ingen spesiell betydning, *
betyr null eller flere tegn, og ?
betyr et enkelt tegn.
Det du vil ekskludere er en prikk etterfulgt av minst en tegn, og deretter et hvilket som helst antall tegn. Så bruk:
grep -r --exclude-dir=".?*" string .
Svar
Siden bash
vil ikke ha grep
krysse skjulte kataloger som standard (dvs. uten dotglob
aktivert:
$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo
Bare ekskluder skjulte filer:
$ grep --exclude=".*" -r foo * file:foo test/file:foo
Kommentarer
- Jeg er nysgjerrig på begrunnelsen bak den ukommenterte nedstemmen.
- Jeg ' t nedstemte, men det ' er ikke sant at
grep
ikke ' ikke krysser skjulte kataloger. Hva du ' å se medgrep -r foo *
er at skallet glob*
ikke ' t utvides til å omfatte skjulte kataloger / filer, med mindredotglob
er angitt medshopt -s dotglob
.grep -r foo .
og du ' Se de skjulte katalogene er krysset av grep. Eller prøv medshopt -s dotglob
og derettergrep -r foo *
. - Fair point; Jeg har avklart dette i svaret mitt.
- Dette vil fremdeles søke i filer i skjulte kataloger som finnes i kommandolinjeargumentene. Det vil liksom fungere. I de fleste tilfeller kan det være greit, men det ' er som å definere " pi " som " 3.1416 "; du kjenner bedre advarslene.
Svar
Du kan også spesifisere den aktuelle katalogen ved hjelp av $(pwd)
som:
grep -r --exclude-dir=".*" string "$(pwd)"
Kommentarer
- Sitat kommandoerstatning:
"$(pwd)"
Se også Hvorfor kveler shell-skriptet mitt i mellomrom eller andre spesialtegn?
Svar
Å gjenskape i en singel katalog (ikke begrenser underkataloger skjulte filer) bruk:
Ettersom echo dir/*
vil skrive ut alle filer i dir, vil dette fungere for filer i noen dir:
$ grep -r "string" $(echo dir/*)
bare endre dir
til .
(punkt) og du får akkurat det du vil ha:
$ grep -r "string" $(echo ./*)
Hvis det som trengs er ingen skjulte filer i noen av underkatalogene, bruk enten:
$ grep -r --exclude-dir=".*" "string"
Eller bruk finn:
find . -not -path "*/\.*" -type f -exec grep "string" {} \+
grep
gir det:grep: warning: recursive search of stdin