Я хотел бы grep все файлы, кроме некоторых типов файлов?

36

Как я могу рекурсивно grepфайлы в заданных папках, кроме пары типов файлов?

Например, я ищу строку в папке моей рабочей области, но она заканчивается поиском в файлах sql и генерирует сериализованные строки.

Так что в этом случае я бы хотел, чтобы grepпапка рабочего пространства, кроме файлов sql.

Я предпочтительно ищу однострочник, если это возможно.

chrisjlee
источник
5
Имейте в виду, что Linux, Unix и unix-a-лайки на самом деле не имеют «типов файлов» так, как вам кажется. Только условно, что имена файлов имеют суффикс ".c" или ".txt" или ".sql" - эти суффиксы даже не являются "расширениями" в стиле Windows, а тем более указывают на то, что исходный код SQL, текста или C работает внутри файлов.
Брюс Эдигер

Ответы:

46

Если у вас есть GNU, grepвы можете использовать --exclude=GLOBопцию, например

grep -r --exclude='*.sql' pattern dir/
jw013
источник
1
Как исключить один файл?
Наим
8

Это сделает это за вас и исключит файлы .sql и .txt:

find /some/dir -type f ! -name '*\.sql' ! -name '*.txt' -print0 | xargs -0 grep 'foobar'

Однако, похоже, что ack был бы гораздо лучшим инструментом для того, что вы пытаетесь сделать:

ack -a --nosql 'foobar' /some/dir
Марк Маккинстри
источник
Извините, я не увидел часть «ack» и добавил ее в свой ответ, который теперь удален.
Шанс
Еще один пользователь отмечает, что ack - a --nobinaryвключает в себя двоичные файлы
Майкл Мрозек
Обратная косая черта в шаблоне имени файла не требуется.
Кусалананда