Проблема с grep

Мне было интересно, почему я получаю следующий вывод при поиске файлов с помощью команды:

$ grep -l prac *
allprac
grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory

Мне было интересно, почему он показывает все остальное, кроме очевидного allprac? Пара перечисленных каталогов пуста.

2 ответа

Решение

* сил grep сканировать все файлы в текущей папке вместо стандартного ввода, но так как grep диск не в подпапках, он просто сообщает о случаях папок в stderrм и отключить отчетность просто перенаправить stderr в /dev/null (POSIX):

$ grep -l prac * 2>/dev/null

тогда дополнительный способ избежать сообщения о папках (не POSIX):

$ grep -l Build --exclude-dir=* *

сканировать, включая подпапки (POSIX):

$ grep -l prac * -r

grep для стандартного ввода (POSIX):

$ cat file | grep -l prac

Есть много реализации grep поэтому он может отличаться друг от друга набором ключей и поведением по умолчанию, но есть стандарт POSIX, который описывает минимальный набор ключей, который должен быть реализован grep (и другие мягкие). Однако я ничего не знаю о том, где POSIX определяет поведение поиска по умолчанию для grep, Кажется, что unix реализация почти grep -l Build --exclude-dir=* * Linux.

Ответ @Cremefraiche правильный: он связан с подстановочными знаками. Однако его решение, похоже, не работает. Поскольку подстановочный знак "*" соответствует всем файлам и папкам (кроме файлов точек), bash заканчивается отправкой имен всех файлов и папок в текущем каталоге в качестве аргументов grep, Поскольку невозможно "прочитать" каталог (аналогично тому, как вы не можете cat каталог), вы должны исключить каталоги. Лучший способ сделать это - использовать find инструмент.

grep -l prac $(find . -maxdepth 1 -type f)

Это будет искать все обычные файлы (-type f) в каталоге. Если вы хотите выполнить рекурсивный поиск таким же образом, просто удалите опцию -maxdepth. Обратите внимание, что это не будет работать для файлов с пробелами в их именах... все еще работает над версией для этого.

Другие вопросы по тегам