In Windows zou ik een zoekopdracht hebben uitgevoerd om een woord in een map te vinden. Evenzo wil ik weten of een specifiek woord voorkomt in een map die veel submappen en bestanden bevat. Mijn zoekopdrachten naar grep-syntaxis laten zien dat ik de bestandsnaam moet specificeren, d.w.z. grep string filename
.
Nu weet ik de bestandsnaam niet, dus wat moet ik doen?
Een vriend stelde voor om grep -nr string
te gebruiken, maar ik weet niet wat dit betekent en ik kreeg er geen resultaten mee (er is geen antwoord totdat ik een Ctrlgeef + C).
Antwoord 1, autoriteit 100%
grep -nr 'yourString*' .
De punt aan het einde zoekt in de huidige directory. Betekenis voor elke parameter:
-n Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r Recursively search subdirectories listed
. Directory for search (current directory)
grep -nr 'MobileAppSer*' .
(Zou MobileAppServlet.java
of MobileAppServlet.class
of MobileAppServlet.txt
; 'MobileAppASer*.*'
is een andere manier om hetzelfde te doen.)
Gebruik de opdracht man grepom meer parameters te controleren.
Antwoord 2, autoriteit 14%
grep -nr string my_directory
Aanvullende opmerkingen: dit voldoet aan de syntaxis grep [options] string filename
omdat in Unix-achtige systemen een directory een soort bestand is (er is een term “normaal bestand” om specifiek naar te verwijzen entiteiten die in Windows gewoon “bestanden” worden genoemd).
grep -nr string
leest de inhoud om te zoeken van de standaardinvoer, daarom wacht het daar gewoon op invoer van u, en stopt hiermee wanneer u op ^C drukt (het zou stoppen op ^D ook, wat de toetsencombinatie is voor het einde van het bestand).
Antwoord 3, autoriteit 7%
GREP: Global Regular Expression Print/Parser/Processor/Program.
U kunt dit gebruiken om de huidige directory te doorzoeken.
U kunt -R specificeren voor “recursief”, wat betekent dat het programma zoekt in alle submappen, en hun submappen, en de submappen van hun submappen, enz.
grep -R "your word" .
-n
drukt het regelnummer af, waar het overeenkomt in het bestand.
-i
zoekt hoofdletterongevoelig (hoofdletters/niet-hoofdletters).
grep -inR "your regex pattern" .
Antwoord 4, autoriteit 3%
Er is ook:
find directory_name -type f -print0 | xargs -0 grep -li word
maar dat is misschien wat veel voor een beginner.
find
is een directory walker/lister voor algemene doeleinden, -type f
betekent “zoek naar gewone bestanden in plaats van naar mappen en benoemde pipes en wat heb je”, -print0
betekent “print ze af op de standaarduitvoer met null-tekens als scheidingstekens”. De uitvoer van find
wordt verzonden naar xargs -0
en pakt de standaardinvoer in brokken (om de lengtebeperkingen van de opdrachtregel te vermijden) met null-tekens als recordscheidingsteken (in plaats van de standaard nieuwe regel) en past vervolgens grep -li word
toe op elke set bestanden. Op de grep
betekent -l
“lijst de bestanden die overeenkomen” en -i
betekent “hoofdlettergevoelig”; je kunt meestal opties voor één teken combineren, zodat je -li
vaker ziet dan -l -i
.
Als je -print0
en -0
niet gebruikt, zul je problemen tegenkomen met bestandsnamen die spaties bevatten, dus het is een goede gewoonte om ze te gebruiken.
Antwoord 5, autoriteit 3%
grep -nr search_string search_dir
zal een RECURSIVE (dat wil zeggen de directory en al zijn subdirectories) doen zoeken naar de search_string. (zoals correct beantwoord door usta).
De reden dat je geen antwoord kreeg op de suggestie van je vriend voor:
grep -nr string
is omdat er geen map is opgegeven. Als u zich in de directory bevindt waarin u wilt zoeken, moet u het volgende doen:
grep -nr string .
Het is belangrijk om de ‘.’ karakter, omdat dit grep vertelt om in DEZE map te zoeken.
Antwoord 6
Waarom niet recursief zoeken om alle instanties in submappen te vinden:
grep -r 'text' *
Dit werkt als een tierelier.
Antwoord 7
Een andere optie die ik graag gebruik:
find folder_name -type f -exec grep your_text {} \;
-type f geeft u alleen bestanden en geen mappen
-exec en {} voeren de grep uit op de bestanden die zijn gevonden in de zoekopdracht (de exacte syntaxis is “-exec command {}”).
Antwoord 8
grep -r "yourstring" *
Vindt “yourstring” in alle bestanden en mappen
Als je nu naar twee verschillende strings tegelijk wilt zoeken, kun je altijd optie E gebruiken en woorden toevoegen voor de zoekopdracht. voorbeeld na de pauze
grep -rE "yourstring|yourotherstring|$" *
zoekt naar lijstlocaties waaryourstring
ofyourotherstring
overeenkomt
Antwoord 9
grep -R "string" /directory/
-R volgt ook symbolische links als -r dat niet doet.
Antwoord 10
Het antwoord dat je hebt gekozen is prima, en het werkt, maar het is niet de juiste manier om het te doen, omdat:
grep -nr yourString* .
Dit doorzoekt de tekenreeksen "yourStrin"
en "g"
0 of vele malen.
Dus de juiste manier om het te doen is:
grep -nr \w*yourString\w* .
Deze opdracht doorzoekt de tekenreeks met een willekeurig teken ervoor en erna in de huidige map.
Antwoord 11
Vergelijkbaar met het antwoord van @eLRuLL, is een eenvoudigere manier om een zoekopdracht op te geven die de woordgrenzen respecteert, door de optie -w
te gebruiken:
grep -wnr "yourString" .
Antwoord 12
Voer (terminal) het volgende commando uit in de directory. Het zal ook recursief in submappen controleren.
grep -r 'your string goes here' *
Antwoord 13
Het volgende voorbeeld ziet er recursief uit voor your search string
in de bestanden *.xml
en *.js
die zich ergens in de mappen path1
, path2
en path3
.
grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3
Je kunt dus in een subset van de bestanden zoeken naar veel mappen, waarbij je alleen de paden aan het einde geeft.
Antwoord 14
Gebruik geen grep. Download Silver Searcherof ripgrep. Ze zijn allebei uitstekend en veel sneller dan grep of ack met talloze opties.