Ik zou graag de bestanden recursief en uniek willen vermelden die het gegeven woord bevatten.
Voorbeeld : Controleren op woord “check”, normaal is een grep
$ grep check * -R
Maar aangezien dit woord veel voorkomt, krijg ik veel output. Dus ik moet alleen de bestandsnamen vermelden die het opgegeven zoekwoord bevatten. Ik denk dat een truc met find
en xargs
hier zou volstaan, maar ik weet het niet zeker.
Enig idee?
Antwoord
Gebruik de -l
of --files-with-matches
optie die als volgt wordt gedocumenteerd:
Normale uitvoer onderdrukken; print in plaats daarvan de naam van elk invoerbestand waaruit de uitvoer normaal gesproken zou zijn afgedrukt. Het scannen stopt bij de eerste wedstrijd. (
-l
wordt gespecificeerd door POSIX.)
Dus voor u kunt u bijvoorbeeld het volgende gebruiken:
$ grep check * -lR
Reacties
Antwoord
find . -type f -exec grep -l check {} +
U wilt waarschijnlijk “niet de optie -R
gebruiken die met moderne versies van GNU grep
volgt symlinks bij aflopende mappen. Gebruik in plaats daarvan de optie -r
die sinds versie 2.12 (april 2012) niet langer symlinks volgt.
Als uw grep niet de GNU-versie is, of ouder is dan versie 2.12, of als u uw code wilt overdragen naar niet-bloeding-edge-GNU-systemen, gebruik dan de find
commando hierboven.
Anders kunt u het volgende doen:
grep -rl check .
Gebruik geen *
(aangezien dat verborgen bestanden in de huidige directory zou weglaten (en alleen in de huidige directory) en problemen zou veroorzaken voor bestanden waarvan de naam begint met een -
), vermijd het doorgeven opties na argumenten als dat is geen garantie teed om te werken afhankelijk van de omgeving en is niet draagbaar.
Antwoord
Probeer dit:
find . -type f | xargs grep -c check $1 | grep -v ":0"
Wat betreft de grep
vlaggen …
-c
zal retourneer een bestandsnaam gevolgd door: en een getal dat aangeeft hoe vaak de zoekreeks in het opgegeven bestand voorkomt.
-v
neemt de uitvoer van de eerste grep
zoek, filter de bestanden met nul resultaten uit, en print alleen de bestanden met niet-nul resultaten.
Opmerkingen
- Dit zal een vals negatief resultaat opleveren als je bestand (en) (of director (ën)) hebt waarvan de naam
:0
bevat. Het ' is betergrep -v ':0$'
te doen. Zelfs dat zal verstikken in padnamen die nieuwe regel (s) bevatten.
Antwoord
grep -lR "text-to-find" <where-to-find>
werkt ook prima.
bijv. grep -lR "NAVIGATE" .
waar we het woord NAVIGATE
vinden in de .
in de huidige directory.
Answer
grep -rin “whatToFind” locationToFInd
eg $ grep -rin “vihaan”.
zal recursief bestandsnamen zoeken en weergeven en de corresponderende regels die “vihaan” in zich hebben, “.” verwijst naar de huidige directory.
Answer
find . -type f | grep "keyword" *
zoek in huidige directory. Om vanuit root op te zoeken, specificeert u /
in plaats van .
Answer
grep -rli trim \` find . -name *.q \`
Geef je de lijst met .q
bestanden bevat het trefwoord trim
grep -rl "text to find" "/usr/share"
en het werkte prima!