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

  • Jó, ha a verziójegyzetet is tartalmazza. A BSD-vel grep a következőt hozza létre: grep: warning: recursive search of stdin

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 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 ' A grep -r foo * alkalmazással azt látjuk, hogy az héjgömb * nem ' t bontsa ki rejtett könyvtárakat / fájlokat, hacsak dotglob nincs beállítva a shopt -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, majd grep -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

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" {} \+ 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük