[LØST] Hvordan skal jeg 'greppe' det an?
Når jeg vil søge efter et ord i flere filer, bruger jeg
Nu vil jeg søge efter et ord i alle (relevante) filer i den aktuelle mappe og alle undermapper, så jeg prøver med
Er der ikke en venlig sjæl, der blot vil fortælle mig den rette formulering?
Editoren Bluefish kan, så man må vel også kunne fra kommandolinien?
./mich
grep
, og det plejer at virke fint.Nu vil jeg søge efter et ord i alle (relevante) filer i den aktuelle mappe og alle undermapper, så jeg prøver med
grep -r
, men får kun vist samme fil(er) som ved blot grep
.find
viser alle (relevante) filer i den aktuelle mappe og alle undermapper, og jeg har prøvet forskellige kombinationer af find
og grep
, men det vil næsten føre for vidt at vise alle detaljer og alle kombinationer.Er der ikke en venlig sjæl, der blot vil fortælle mig den rette formulering?
Editoren Bluefish kan, så man må vel også kunne fra kommandolinien?
./mich
Kommentarer4
Kommandoen du leder efter
grep -ri foobar
Jeg bruger den noget nært dagligt, når jeg er på arbejde.
søge efter et ord i
Det lyder rigtigt at bruge "grep -r", men jeg er i tvivl om hvad du mener med "relevante" filer, for grep -r tager jo ukritisk hele molevitten.
Det lyder underligt, at du ikke får det til at virke - bruger du mappen, som sidste argument?
grep -r "string" /sti/til/rekursiv/grep
Hvis du vil nøjes med bestemte filer (som udvælges med find), så er der flere måder. Du kan bruge find's -exec argument til at afvikle grep på de filer, som findes. Når man bare skal udover stepperne plejer jeg at bruge xargs. Fx.
find /startsti/til/søgning -name "*.log" | xargs grep "streng"
Husk at grep som udgangspunkt er case sensitiv. Det kan du ændre med -i parametren ligesom pallepind gør i sit eksempel.
EDIT: Nåja, hvis du bruger specialtegn og/eller mellemrum i fil/mappe-navne, så brug denne variant istedet:
find /startsti/til/søgning -name "*.log" -print0 | xargs -0 grep "streng"
Tak for rådene
Hvornår kan man søge i filer, og hvornår kan man kun søge i mapper? Hvornår skal man bruge " og hvornår '? Og hvornår skal man lade være?
Oprindeligt havde jeg den opfattelse, at
grep -r cookie *.php
ville vise alle filer indeholdende strengen 'cookie' i alle php-filer i den aktuelle mappe og alle undermapper. *.php skulle virke som filter, så grep kun gennemsøgte hvad jeg kaldte relevante filer.Men nej. grep gennemsøgte kun filer i den aktuelle mappe.
grep -ri cookie ./
derimod viste alle forekomster af 'cookie' i alle filer i ./ og derunder. Ikke helt det jeg ønskede, men dog tættere på.Efter flere forsøg med og uden " diverse steder nåede jeg frem til at
grep -ri --include "*.php" -e "cookie" ./
giver de ønskede resultat, og alternativt giverfind . -iname "*.php" -type f -exec grep cookie '{}' ';'
samme resultat.I, der svarede, og tak for det - I ledte mig på rette vej, I ved selvfølgelig allerede alt dette, så det er ikke for jeres oplysnings skyld jeg skriver dette, men for at vise hvad der ledte mig til at spørge og gøre som jeg gjorde, og med det lønlige håb, at det måske kan hjælpe andre, der også farer vild i
bash
's uransagelige verden.Oprindeligt havde jeg
Bare for forståelsens skyld:
Det, der sker i dit tilfælde er, at bash folder *.php ud. '*.php' foldes ud som alle filer i den aktuelle mappe, som hedder .php til efternavn.
Dvs. hvis du står i en mappe med filerne 1.php og 2.php, og afvikler grep -r cookie *.php, så svarer det til at afvikle:
grep -r cookie 1.php 2.php
Hvis du vil undgå at bash folder den ud (også kendt som "globbing"), så kan du eksempelvis komme det i citationstegn:
grep -r cookie "*.php"
Sidstnævnte kommando er så ubrugelig i dit tilfælde af andre årsager.... som du også har fundet ud af :)