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

  • Dobré pro zahrnutí poznámky k verzi. S BSD grep produkuje: grep: warning: recursive search of stdin

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íky grep -r foo * vidíme, že shell glob * ' t expandovat tak, aby zahrnoval skryté adresáře / soubory, pokud dotglob nebyl nastaven na shopt -s dotglob. Zkuste s grep -r foo . a vy ' uvidím skryté adresáře, které prochází grep. Nebo zkuste shopt -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

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *