Проблема с 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. Обратите внимание, что это не будет работать для файлов с пробелами в их именах... все еще работает над версией для этого.