Я задавался вопросом, почему я получаю следующий вывод при поиске файлов с командой:
$ 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
? Несколько перечисленных каталогов пусты.
*
силы grep
просканировать во всех файлах в текущей папке вместо того, чтобы захватить стандартный вход, но с тех пор grep
диск не в подпапки это просто сообщает о папке ocurriences stderr
m и отключить создание отчетов просто перенаправляют 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
(и другое мягкое). Однако я ничего не знаю о wheither, для которого POSIX определяет поиск по умолчанию dehaviour grep
. Это кажется tha unix
реализация делает почти к grep -l Build --exclude-dir=* *
из Linux.
ответ @Cremefraiche является правильным в этом, это происходит из-за подстановочного знака. Однако его решение, кажется, не работает. Начиная с '*' подстановочный знак оболочки соответствует всем файлам и папкам (кроме точечных файлов), bash
заканчивает тем, что отправил названия всех файлов и папок в текущем каталоге как аргументы grep
. Так как не возможно "читать в" каталоге (подобный тому, как Вы не можете cat
каталог), необходимо исключить каталоги. Лучший способ сделать это должно было бы использовать find
инструмент.
grep -l prac $(find . -maxdepth 1 -type f)
Это искало бы все регулярные файлы (-тип f) в каталоге. Если Вы хотите сделать рекурсивный поиск таким же образом, просто удалите-maxdepth опцию. Отметьте, это не будет работать на файлы с пробелами на их имена... все еще работающие над версией для этого.