A ennek a kérdésnek a tanácsát követve képes vagyok rekurzív módon megfogni egy karakterláncot string
egy adott könyvtár tartalmában dir
az alábbiak szerint
grep -r --exclude-dir=".*" string dir
Amikor azonban ezt az aktuális könyvtárra alkalmazom,
$ grep -r --exclude-dir=".*" string . $
Nem kapok eredményt, mivel a --exclude-dir=".*"
opció kihagyja az aktuális könyvtárat rejtettként, mivel megfelel az ".*"
kifejezésnek.
A megoldás az, hogy a , majd futtassa a parancsot a megfelelő gyermeken, majd cd
ismét vissza az eredeti munkakönyvtárba. Egy parancsnak kell lennie, amellyel ezt megtehetem a könyvtárak megváltoztatásának elkerülése nélkül.
Mi az egyetlen parancs a tartalom megkaparására az aktuális könyvtárból, kihagyva a rejtett könyvtárak tartalmát?
Válasz
Ha a GNU grep 2.11 vagy újabb verziót használja, akkor a -r
az aktuális könyvtárból indul, ha nincs megadva könyvtár:
grep -r --exclude-dir=".*" string
Megjegyzések
Válasz
A héjgömbben (más néven fájlnévminták) a .
nincs különösebb jelentése, *
nulla vagy több karaktert jelent, a ?
bármelyik karaktert jelenti.
Amit ki szeretne zárni, az egy pont, amelyet legalább egy em követ > karakter, majd tetszőleges számú karakter. Tehát használja:
grep -r --exclude-dir=".?*" string .
Válasz
Mivel bash
nem fog grep
alapértelmezés szerint bejárni a rejtett könyvtárakat (azaz ha dotglob
engedélyezve van:
$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo
Csak rejtse el a rejtett fájlokat:
$ grep --exclude=".*" -r foo * file:foo test/file:foo
Megjegyzések
- kíváncsi vagyok a meg nem jegyzett visszavonás okaira.
- Nem ' nem szavaztam, de ' s nem igaz, hogy
grep
nem ' t járja át a rejtett könyvtárakat. Amit ' Agrep -r foo *
alkalmazással azt látjuk, hogy az héjgömb*
nem ' t bontsa ki rejtett könyvtárakat / fájlokat, hacsakdotglob
nincs beállítva ashopt -s dotglob
értékkel.grep -r foo .
és te ' látni fogja, hogy a rejtett könyvtárakat a grep végigjárja. Vagy próbálkozzon a következővel:shopt -s dotglob
, majdgrep -r foo *
. - Igaz pont; Ezt a válaszomban pontosítottam.
- Ez továbbra is a parancssori argumentumokban található rejtett könyvtárakban keres fájlokat. mintegy működni fog. A legtöbb esetben ez rendben lehet, de ' olyan, mint " pi " mint " 3.1416 "; jobban ismeri a figyelmeztetéseket.
Válasz
Az aktuális könyvtárat a mint:
grep -r --exclude-dir=".*" string "$(pwd)"
Megjegyzések
- Idézd a parancs helyettesítését:
"$(pwd)"
Lásd még: Miért fojtja el a shell szkriptem a szóközt vagy más speciális karaktereket?
Válasz
Egy single könyvtár (nem korlátozza az alkönyvtárak rejtett fájljait) használata:
Mivel echo dir/*
kinyomtatja az összes fájlt a dir-ben, ez a néhány direktorban található fájlok esetében is működik:
$ grep -r "string" $(echo dir/*)
csak módosítsa a dir
értéket .
(pont) és pontosan megkapja, amit akar:
$ grep -r "string" $(echo ./*)
Ha egyik alkönyvtárban sem rejtett fájlok vannak, akkor használja:
$ grep -r --exclude-dir=".*" "string"
Vagy használja a keresést:
find . -not -path "*/\.*" -type f -exec grep "string" {} \+
grep
a következőt hozza létre:grep: warning: recursive search of stdin