«Grep -r foo *» против «grep -r foo».

10

При использовании grep -r вы можете искать во всех файлах либо *, либо. и, кажется, возвращает то же самое, но действительно ли это то же самое?

Допустим, я ищу "Foo", то я мог бы написать

grep -r foo *

или

grep -r foo .

Будет ли кто-нибудь попытаться объяснить разницу между. и *?

Johan
источник

Ответы:

15

grep -r foo *не ищет совпадения в скрытых файлах или каталогах, также *расширяется оболочкой, так что вы можете получить слишком длинную ошибку в списке аргументов, если в текущем каталоге много записей, или другие ошибки или неправильное поведение, если Имя некоторых файлов или каталогов начинается с символа тире.

Invocation grep -r foo .не имеет вышеуказанных недостатков

Обновлено:

Еще одно отличие: справочная страница grep (@ fedora17) гласит:

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

Также будет разница при выполнении этой команды в пустой директории:

$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$
otokan
источник
4

Если вы используете звездочку, вы не можете сопоставлять файлы в каталогах, чье имя начинается с точки, например .cache.

Обновить:

Это связано с *тем, что оболочка раскрывается перед вызовом grep, поэтому она получает список имен вместо одного имени каталога (для текущего .). Способ оболочки расширить шаблон может быть настроен с параметром оболочки (как nullglob, nocaseglobили другие bashварианты) или быть переменными окружения (например , LANGили LC_ALL)

eppesuig
источник