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
.
find . -type f -print -exec cat {} \; | grep some string
Bovenstaand commando drukt het bestandspad niet af.
Ik gebruik: Ubuntu, bash 4
.
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
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"
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).
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 {} \;
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)