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

  • Godt at inkludere versionsnoten. Med BSD grep producerer det: grep: warning: recursive search of stdin

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 med grep -r foo * er, at shell glob * ikke ' t udvides til at omfatte skjulte mapper / filer, medmindre dotglob er indstillet med shopt -s dotglob. grep -r foo . og du ' Se de skjulte mapper krydses af grep. Eller prøv med shopt -s dotglob og derefter grep -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

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *