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

  • Bra med å inkludere versjonsnotatet. Med BSD grep gir det: grep: warning: recursive search of stdin

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 med grep -r foo * er at skallet glob * ikke ' t utvides til å omfatte skjulte kataloger / filer, med mindre dotglob er angitt med shopt -s dotglob. grep -r foo . og du ' Se de skjulte katalogene er krysset av grep. Eller prøv med shopt -s dotglob og deretter grep -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

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" {} \+ 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *