„Grep -r foo *” vs „grep -r foo.”

10

Używając grep -r, możesz przeszukiwać wszystkie pliki za pomocą * lub. i wydaje się, że zwraca to samo, ale czy to naprawdę to samo?

Powiedzmy, że szukam „foo”, a potem mógłbym pisać

grep -r foo *

lub

grep -r foo .

Czy ktoś próbowałby wyjaśnić różnicę między. i *?

Johan
źródło

Odpowiedzi:

15

grep -r foo *nie wyszukuje dopasowań w ukrytych plikach lub katalogach, *jest również rozszerzany przez powłokę, więc możesz skończyć z zbyt długim błędem listy argumentów, gdy w bieżącym katalogu jest dużo wpisów, lub innymi błędami lub złym zachowaniem, jeśli nazwa niektórych plików lub katalogów zaczyna się od myślnika.

Inwokacja grep -r foo .nie ma powyższych wad

Zaktualizowano:

Kolejna różnica: strona man grep (@ fedora17) mówi:

-r, --recursive
    Read all files under each directory, recursively, following symbolic links only if they
    are on  the  command  line.  ...

Różnica wystąpi także po wykonaniu tego polecenia w pustym katalogu:

$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$
otokan
źródło
4

Jeśli używasz gwiazdki, nie możesz dopasować plików w katalogach, których nazwa zaczyna się od kropki, np .cache.

Aktualizacja:

Wynika to z faktu, że *jest on rozszerzany przez powłokę przed wywołaniem grep, więc otrzymuje listę nazw zamiast pojedynczej nazwy katalogu (dla bieżącego .). Sposobem powłoki rozwinąć wzór może być dostosowany za pomocą parametru powłoki (jak nullglob, nocasegloblub inne bashopcje) lub być zmienne środowiska (np LANGlub LC_ALL)

eppesuig
źródło