"Grep -r foo *" проти "grep -r foo".


10

Використовуючи grep -r, ви можете шукати у всіх файлах або *, або. і, здається, повертає те саме, але чи справді це те саме?

Скажімо, я шукаю "foo", тоді я міг би написати

grep -r foo *

або

grep -r foo .

Хто-небудь спробує пояснити різницю між. і *?

Відповіді:


15

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

Виклик 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
$

4

Якщо ви використовуєте зірочку, ви не можете зіставити файли в каталогах, назва яких починається з крапки, як-от .cache.

Оновлення:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.