Podle pokynů v této otázce jsem schopen rekurzivně grep pro řetězec string
v obsahu daného adresáře dir
takto
grep -r --exclude-dir=".*" string dir
Když to však použiji na aktuální adresář, jako
$ grep -r --exclude-dir=".*" string . $
nedostanu žádné výsledky, protože --exclude-dir=".*"
možnost vynechá aktuální adresář jako skrytý, protože odpovídá ".*"
.
Řešením je změna nadřazeného adresáře pomocí cd ..
, poté spusťte příkaz na příslušném dítěti a poté cd
znovu zpět do původního pracovního adresáře. Musí existovat jediný příkaz, který k tomu mohu použít, aniž bych musel obměňovat adresáře.
Co je to jediný příkaz pro grep obsah aktuálního adresáře, vynecháte obsah skrytých adresářů?
Odpovědět
Pokud používáte GNU grep 2.11 nebo novější, bude -r
spuštěn z aktuálního adresáře, pokud není zadán žádný adresář:
grep -r --exclude-dir=".*" string
Komentáře
odpověď
V prostředí glob glob (také známém jako vzory souborů) nemá .
žádný zvláštní význam, *
znamená nula nebo více znaků a ?
znamená libovolný jeden znak.
To, co chcete vyloučit, je tečka následovaná alespoň jedním znak a poté libovolný počet znaků. Použijte tedy:
grep -r --exclude-dir=".?*" string .
Odpověď
Protože bash
nebude grep
ve výchozím nastavení procházet skryté adresáře (tj. bez dotglob
povoleno:
$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo
Stačí vyloučit skryté soubory:
$ grep --exclude=".*" -r foo * file:foo test/file:foo
Komentáře
- Jsem zvědavý na důvody nekomentovaného downvote.
- Neudělal jsem ' t downvote, ale ' není pravda, že
grep
neprochází ' t skrytými adresáři. Co ' Díkygrep -r foo *
vidíme, že shell glob*
' t expandovat tak, aby zahrnoval skryté adresáře / soubory, pokuddotglob
nebyl nastaven nashopt -s dotglob
. Zkuste sgrep -r foo .
a vy ' uvidím skryté adresáře, které prochází grep. Nebo zkusteshopt -s dotglob
a potégrep -r foo *
. - Fair point; Vysvětlil jsem to ve své odpovědi.
- Toto bude stále hledat soubory ve skrytých adresářích obsažených v argumentech příkazového řádku. Bude něco fungovat. Ve většině případů to může být v pořádku, ale ' se to podobá definování " pi " jako " 3.1416 "; měli byste lépe znát upozornění.
Odpověď
Aktuální adresář můžete také určit pomocí $(pwd)
like:
grep -r --exclude-dir=".*" string "$(pwd)"
Komentáře
- Citujte substituci svého příkazu:
"$(pwd)"
Viz také Proč se můj skript škrtí mezerami nebo jinými speciálními znaky?
Odpověď
Opakovat se uvnitř jednoho (neomezuje skryté soubory podadresářů) použití:
Protože echo dir/*
vytiskne všechny soubory uvnitř adresáře, bude to fungovat u souborů uvnitř některých adresářů:
$ grep -r "string" $(echo dir/*)
stačí změnit dir
na .
(tečka) a dostanete přesně to, co chcete:
$ grep -r "string" $(echo ./*)
Pokud nepotřebujete žádné skryté soubory v žádném z podadresářů, použijte:
$ grep -r --exclude-dir=".*" "string"
Nebo použijte find:
find . -not -path "*/\.*" -type f -exec grep "string" {} \+
grep
produkuje:grep: warning: recursive search of stdin