проблема с 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? Несколько перечисленных каталогов пусты.

1
задан 10 December 2014 в 23:12

2 ответа

* силы grep просканировать во всех файлах в текущей папке вместо того, чтобы захватить стандартный вход, но с тех пор grep диск не в подпапки это просто сообщает о папке ocurriences stderrm и отключить создание отчетов просто перенаправляют 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.

2
ответ дан 7 December 2019 в 14:03

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

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

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

0
ответ дан 10 November 2019 в 23:28

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

Похожие вопросы: