2013-07-02 09:24:45 +0000 2013-07-02 09:24:45 +0000
83
83

Bestanden zoeken die een bepaalde string bevatten met find (1) en grep (1)

find . -type f -print -exec cat {} \; | grep some string

Bovenstaand commando drukt het bestandspad niet af.

Ik gebruik: Ubuntu, bash 4.

Antwoorden (5)

117
117
117
2013-07-02 12:01:16 +0000

Ik gebruik

grep "some string" . -R

en het werkt sneller

p.s.

Complexer use case

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex

Om param te lezen leg ik uit

grep --help | grep -- -i
98
98
98
2013-07-02 10:02:41 +0000

Dat komt omdat je grep een stroom van tekst geeft die toevallig bestandsnamen bevat. Omdat je geen bestandsnamen als argumenten aan grep hebt meegegeven, kan niet van grep verwacht worden dat het afleidt uit welk bestand een gematchte regel komt. Gebruik xargs:

find . -type f -print | xargs grep "some string"

Aangezien je GNU find/xargs hebt, is dit een veiliger manier voor xargs om bestandsnamen te lezen:

find . -type f -print0 | xargs -0 grep "some string"

Als je alleen de bestandsnamen wilt die een overeenkomstige regel hebben, zonder de overeenkomstige regel te laten zien:

find . -type f -print0 | xargs -0 grep -l "some string"
14
14
14
2014-09-26 13:24:22 +0000

Ik zoek vaak naar broncode in complexe mapstructuren en ik vind het handig om te gebruiken:

cd /your/folder/
grep -rHino "your string"

Met die parameters, zonder find te gebruiken, krijg ik het volledige pad van het bestand en het regelnummer dat de gespecificeerde string bevat.

Het is ook makkelijk te onthouden omdat het BASH door je zoekopdracht gaat als een rHino :)

Ik zal met een snel voorbeeld laten zien hoe dit werkt.

Laten we de inhoud van een bestand laten zien met cat:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

En laten we recursief zoeken naar alle bestanden die de string “iptables -P” bevatten:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

Zoals u kunt zien in de uitvoer hebben we filename:hit row:searched string

Hier is een meer gedetailleerde beschrijving van de gebruikte parameters:

-r Voor elke directory operand, lees en verwerk alle bestanden in die directory, recursief. Volg symbolische links op de opdrachtregel, maar sla symlinks over die recursief worden aangetroffen. Merk op dat als er geen bestand operand is gegeven, grep de werkdirectory doorzoekt. Dit is hetzelfde als de optie ‘–directories=recurse’.

-i Druk de bestandsnaam af voor elke overeenkomst. Dit is de standaardinstelling als er meer dan één bestand is om te zoeken.

-n Voorvoeg elke uitvoerregel met het 1-gebaseerde regelnummer in zijn invoerbestand. (-n wordt door POSIX gespecificeerd.)

-H Druk de bestandsnaam voor elke overeenkomst af. Dit is de standaardinstelling als er meer dan één bestand is om te doorzoeken.

-o Druk alleen de gematchte (niet-lege) delen van overeenkomende regels af, met elk van die delen op een aparte uitvoerregel. Uitvoerregels gebruiken dezelfde scheidingstekens als invoer, en scheidingstekens zijn null bytes als -z (–null-data) ook wordt gebruikt (zie Andere opties).

2
2
2
2015-10-28 19:03:56 +0000

Ik gaf de voorkeur aan

| vind het bestand |make grep ont finding file | show de full path of the file

find / -type f -exec grep ‘some string’ {} \; -exec echo {} \;

0
0
0
2018-10-22 16:15:38 +0000

Silver Searcher ](https://github.com/ggreer/the_silver_searcher) is een zeer snel en handig hulpprogramma om naar bestanden en inhoud te zoeken.

Om je probleem op te lossen zou het silver searcher commando er als volgt uitzien…

ag 'some string' -l

-l Druk alleen bestandsnamen af die overeenkomsten bevatten (druk niet de overeenkomende regels af)