Vraag Hoe vind ik alle bestanden met specifieke tekst op Linux?


Ik probeer een manier te vinden om mijn volledige Linux-systeem te scannen op alle bestanden die een specifieke reeks tekst bevatten. Voor de duidelijkheid, ik ben op zoek naar tekst in het bestand, niet in de bestandsnaam.

Toen ik zocht naar hoe ik dit moest doen, kwam ik deze oplossing twee keer tegen:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Het werkt echter niet. Het lijkt elk bestand in het systeem weer te geven.

Ligt dit dicht bij de juiste manier om het te doen? Zo nee, hoe zou ik dat moeten doen? Deze mogelijkheid om tekstreeksen in bestanden te vinden zou buitengewoon nuttig zijn voor sommige programmeerprojecten die ik aan het doen ben.


3677
2018-06-06 08:06


oorsprong


antwoorden:


Doe het volgende:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r of -R is recursief,
  • -n is regelnummer en
  • -w staat voor match het hele woord.
  • -l (kleine letter L) kan worden toegevoegd om alleen de bestandsnaam van overeenkomende bestanden te geven.

Samen met deze --exclude, --include, --exclude-dir vlaggen kunnen worden gebruikt voor efficiënt zoeken:

  • Hiermee wordt alleen gezocht in de bestanden met de extensie .c of .h:

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • Dit zal het zoeken uitsluiten van alle bestanden die eindigen op .o extensie:

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Voor mappen is het mogelijk om een ​​bepaalde map (pen) uit te sluiten --exclude-dir parameter. Dit sluit bijvoorbeeld de mappen dir1 /, dir2 / en allemaal overeen met * .dst /:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

Dit werkt heel goed voor mij, om bijna hetzelfde doel als het uwe te bereiken.

Controleer voor meer opties man grep.


6648
2018-06-06 08:21



Je kunt gebruiken grep -ilR:

grep -Ril "text-to-find-here" /
  • i staat voor negeren (optioneel in uw geval).
  • R staat voor recursief.
  • l staat voor "toon de bestandsnaam, niet het resultaat zelf".
  • / staat voor beginnen bij de hoofdmap van uw machine.

1085
2018-06-06 08:08



Je kunt gebruiken ack. Het is zo grep voor broncode. Je kunt je hele bestandssysteem ermee scannen.

Gewoon doen:

ack 'text-to-find-here'

In je root directory.

Je kan ook gebruiken normale uitdrukkingen, specificeer het bestandstype, etc.


BIJWERKEN

Ik heb net ontdekt De zilveren zoeker, wat lijkt op ack maar 3-5x sneller dan het is en zelfs patronen negeert van a .gitignore het dossier.


232
2018-06-06 08:26



Je kunt gebruiken:

grep -r "string to be searched"  /path/to/dir

De r staat voor recursief en zal dus zoeken in het gespecificeerde pad en ook zijn onder-mappen. Hiermee wordt de bestandsnaam weergegeven en wordt de regel afgedrukt in het bestand waarin de tekenreeks wordt weergegeven.

Of een soortgelijke opdracht als die u probeert (bijvoorbeeld:) voor zoeken in alle javascript-bestanden (* .js):

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

Hiermee worden de lijnen afgedrukt in de bestanden waar de tekst wordt weergegeven, maar wordt de bestandsnaam niet afgedrukt.

Naast deze opdracht kunnen we dit ook schrijven: grep -rn "String om te zoeken" / pad / naar / map / of / bestand -r: recursieve zoekopdracht n: regelnummer wordt getoond voor overeenkomsten


125
2018-03-14 23:29



U kunt dit gebruiken:

grep -inr "Text" folder/to/be/searched/

83
2017-07-31 13:44



Lijst met bestandsnamen die een bepaalde tekst bevatten

Allereerst denk ik dat je hebt gebruikt -H in plaats van -l. Je kunt ook proberen de tekst tussen aanhalingstekens toe te voegen, gevolgd door {} \.

find / -type f -exec grep -l "text-to-find-here" {} \; 

Voorbeeld

Stel dat u zoekt naar bestanden met de specifieke tekst "Apache-licentie" in uw directory. Het zal de resultaten enigszins vergelijkbaar met hieronder weergeven (de uitvoer zal anders zijn op basis van de inhoud van uw directory).

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

Hoofdlettergevoeligheid verwijderen

Zelfs als u geen gebruik maakt van de case zoals "text" versus "TEXT", kunt u de -i overschakelen om te negeren. U kunt meer informatie lezen hier.

Ik hoop dat dit je helpt.


48
2017-11-09 13:18



Als jouw grep ondersteunt geen recursieve zoekopdracht, die u kunt combineren find met xargs:

find / -type f | xargs grep 'text-to-find-here'

Ik vind dit gemakkelijker te onthouden dan het formaat voor find -exec.

Dit zal de bestandsnaam en de inhoud van de overeenkomende regel, b.v.

/home/rob/file:text-to-find-here

Optionele vlaggen die u mogelijk wilt toevoegen grep:

  • -i - Hoofdletterongevoelig zoeken
  • -l - voer alleen de bestandsnaam uit waar de overeenkomst werd gevonden
  • -h - voer alleen de regel uit die overeenkomt (niet de bestandsnaam)

46
2018-06-20 08:49



grep -insr "pattern" *
  • i: Negeer onderscheid tussen letters in zowel het PATROON als de invoerbestanden.
  • n: Voer een voorvoegsel in voor elke regel met het 1-regelige regelnummer in het invoerbestand.
  • s: Onderdruk foutmeldingen over niet-bestaande of onleesbare bestanden.
  • r: Lees alle bestanden onder elke map recursief.

34
2018-02-26 05:47