Volgens het advies onder deze vraag, kan ik recursief grepen voor een string string binnen de inhoud van een bepaalde directory dir als volgt

grep -r --exclude-dir=".*" string dir 

Wanneer ik dit echter toepas op de huidige directory, zoals

$ grep -r --exclude-dir=".*" string . $ 

krijg ik geen resultaten, aangezien de --exclude-dir=".*" optie laat de huidige map weg als verborgen omdat deze overeenkomt met ".*".

Een oplossing is om naar de bovenliggende map te gaan via cd .., voer dan het commando uit op het juiste kind, en dan cd weer terug naar die originele werkdirectory. Er moet een enkele opdracht zijn die ik kan gebruiken om dit te doen zonder de work-around van mappen te veranderen.

Wat is een enkele opdracht om de inhoud te grepen van de huidige map, waarbij de inhoud van verborgen mappen wordt weggelaten?

Antwoord

Als je GNU grep 2.11 of hoger gebruikt, start -r vanaf de huidige directory als er geen directory is opgegeven:

grep -r --exclude-dir=".*" string 

Reacties

  • Goed in het opnemen van de versienotitie. Met BSD grep produceert het: grep: warning: recursive search of stdin

Antwoord

In shell glob (ook bekend als bestandsnaampatronen), . heeft geen speciale betekenis, * betekent nul of meer tekens, en ? betekent elk willekeurig teken.

Wat u wilt uitsluiten is een punt gevolgd door ten minste één teken en vervolgens een willekeurig aantal tekens. Gebruik dus:

grep -r --exclude-dir=".?*" string . 

Antwoord

Sinds bash zal “t grep niet standaard door verborgen mappen gaan (dwz zonder dotglob ingeschakeld:

$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo 

Sluit gewoon verborgen bestanden uit:

$ grep --exclude=".*" -r foo * file:foo test/file:foo 

Reacties

  • Ik ben benieuwd naar de redenering achter de stem zonder commentaar.
  • Ik heb ' niet neergestemd, maar het ' Het is niet waar dat grep niet ' verborgen mappen doorkruist. Wat je ' opnieuw zien met grep -r foo * is dat de shell glob * niet ' t uitbreiden met verborgen mappen / bestanden, tenzij dotglob is ingesteld met shopt -s dotglob. Probeer het met grep -r foo . en jij ' Ik zie dat de verborgen mappen worden doorlopen door grep. Of probeer het met shopt -s dotglob en vervolgens grep -r foo *.
  • Redelijk punt; Ik heb dit in mijn antwoord verduidelijkt.
  • Hiermee worden nog steeds bestanden doorzocht in verborgen mappen binnen de opdrachtregelargumenten. Het zal soort van werken. In de meeste gevallen is het misschien in orde, maar het ' lijkt op het definiëren van " pi " als " 3.1416 "; je kent de voorbehouden beter.

Answer

Je zou ook de huidige directory kunnen specificeren met $(pwd) zoals:

grep -r --exclude-dir=".*" string "$(pwd)" 

Reacties

Antwoord

Om te recurseren in een single directory (niet beperkt tot verborgen subdiredtories) use:

Aangezien echo dir/* alle bestanden in de map zal afdrukken, werkt dit voor bestanden in een map:

$ grep -r "string" $(echo dir/*) 

verander gewoon dir in . (punt) en je krijgt precies wat je wilt:

$ grep -r "string" $(echo ./*) 

Als er geen verborgen bestanden in een van de submappen nodig zijn, gebruik dan:

$ grep -r --exclude-dir=".*" "string" 

Of gebruik find:

find . -not -path "*/\.*" -type f -exec grep "string" {} \+ 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *