Efter rådgivning under dette spørgsmål kan jeg rekursivt gribe efter en streng string
i indholdet af en given mappe dir
som følger
grep -r --exclude-dir=".*" string dir
Når jeg anvender dette på den aktuelle mappe, som
$ grep -r --exclude-dir=".*" string . $
, får jeg ingen resultater, da --exclude-dir=".*"
option udelader den aktuelle mappe som skjult, da den matcher ".*"
.
En løsning er at skifte til den overordnede mappe via cd ..
, kør derefter kommandoen på det relevante barn, og cd
igen i den originale arbejdsmappe. Der skal være en enkelt kommando, som jeg kan bruge til at gøre dette uden at arbejde rundt med at ændre mapper.
Hvad er en enkelt kommando til grep-indhold i det aktuelle bibliotek, udelader indholdet af skjulte mapper?
Svar
Hvis du bruger GNU grep 2.11 eller nyere, starter -r
fra den aktuelle mappe, hvis der ikke er angivet en mappe:
grep -r --exclude-dir=".*" string
Kommentarer
Svar
I shell glob (også kendt som filnavnsmønstre) har .
ingen særlig betydning, *
betyder nul eller flere tegn, og ?
betyder ethvert enkelt tegn.
Det, du vil ekskludere, er en prik efterfulgt af mindst en tegn og derefter et vilkårligt antal tegn. Så brug:
grep -r --exclude-dir=".?*" string .
Svar
Da bash
vandt ikke grep
som standard gennemgå skjulte mapper (dvs. uden dotglob
aktiveret:
$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo
Ekskluder bare skjulte filer:
$ grep --exclude=".*" -r foo * file:foo test/file:foo
Kommentarer
- Jeg er nysgerrig efter begrundelsen for den ikke-kommenterede nedstemning.
- Jeg ' t downvote, men det ' er ikke sandt, at
grep
ikke ' ikke krydser skjulte mapper. Hvad du ' at se igen medgrep -r foo *
er, at shell glob*
ikke ' t udvides til at omfatte skjulte mapper / filer, medmindredotglob
er indstillet medshopt -s dotglob
.grep -r foo .
og du ' Se de skjulte mapper krydses af grep. Eller prøv medshopt -s dotglob
og dereftergrep -r foo *
. - Fair point; Jeg har afklaret dette i mit svar.
- Dette søger stadig filer i skjulte mapper indeholdt i kommandolinjeargumenterne. Det fungerer slags . I de fleste tilfælde kan det være okay, men det ' er som at definere " pi " som " 3.1416 "; du kender bedre forbeholdene.
Svar
Du kan også specificere den aktuelle mappe ved hjælp af $(pwd)
som:
grep -r --exclude-dir=".*" string "$(pwd)"
Kommentarer
- Citér din kommandosubstitution:
"$(pwd)"
Se også Hvorfor kvæler mit shell-script i det hvide rum eller andre specialtegn?
Svar
For at genskabe inde i en enkelt -mappe (begrænser ikke underordnede historier til skjulte filer) brug:
Da echo dir/*
udskriver alle filer inde i dir, vil dette fungere for filer inde i nogle dir:
$ grep -r "string" $(echo dir/*)
skift bare dir
til .
(dot) og du får præcis det, du vil have:
$ grep -r "string" $(echo ./*)
Hvis der ikke er behov for skjulte filer i nogen af underkatalogerne, skal du enten bruge:
$ grep -r --exclude-dir=".*" "string"
Eller brug find:
find . -not -path "*/\.*" -type f -exec grep "string" {} \+
grep
producerer det:grep: warning: recursive search of stdin