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
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 metgrep -r foo *
is dat de shell glob*
niet ' t uitbreiden met verborgen mappen / bestanden, tenzijdotglob
is ingesteld metshopt -s dotglob
. Probeer het metgrep -r foo .
en jij ' Ik zie dat de verborgen mappen worden doorlopen door grep. Of probeer het metshopt -s dotglob
en vervolgensgrep -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
- Citeer je opdrachtvervanging:
"$(pwd)"
Zie ook Waarom verslikt mijn shellscript in witruimte of andere speciale tekens?
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" {} \+
grep
produceert het:grep: warning: recursive search of stdin