В эти дни я бы рекомендовал использовать ag, ackили cgrepвместо этого - они намного быстрее / лучше, чем grepдля поиска в хранилищах кода.
lunixbochs
Если вы просматриваете код и стараетесь избегать определенных каталогов, возможно, вам стоит взглянуть на ack. Это grep с поддержкой исходного кода, и поэтому он будет активно игнорировать такие каталоги VCS (а также резервные копии vi и emacs, не исходные файлы и т. Д.).
Брайан Агнью
2
Как пользователь может получать No such file or directoryсообщения для существующих файлов и / или каталогов? Или, наоборот, как можно grep *получить имена файлов, которые не существуют? Это условие гонки, когда какой-то другой процесс манипулирует деревом каталогов (создавая, переименовывая и удаляя файлы) во время grepработы?
Скотт
Ответы:
300
Вы можете использовать флаг -sили --no-messagesдля подавления ошибок.
@Alex @Dogbert Это отвечает на вопрос, но '-s' может маскировать проблемы, например, когда вы используете xargs с grep. Попробуйте создать 2 файла в директории 'aaa.txt' и 'a b.txt', каждый из которых содержит строку 'some text'. Команда /bin/ls -1 | xargs grep 'some text'выдаст вам «нет такого файла или каталога», потому что она разбивает файл «b.txt» на 2 аргумента. Если вы подавите, вы не заметите, что пропустили файл.
Кельвин
@ Кельвин делает, например, если я использую findи использую print0с xargs -0Решает ли это проблему? Спасибо
Лука
1
@ Лука Это должно решить проблему. Вы не столкнетесь с проблемами, если будете всегда использовать эти параметры NUL, но если вы этого не сделаете, это почти гарантировано (ИМХО), что вы забудете в самый неподходящий момент.
Кельвин
это работает на Mac OS X, где другие опции (--quiet) не
работают
59
Если вы просматриваете git-репозиторий, я бы порекомендовал вам использовать git grep. Вам не нужно проходить -Rили путь.
git grep pattern
Это покажет все совпадения из вашего текущего каталога вниз.
Отвечает на вопрос, но может маскировать проблемы. Смотрите мой комментарий под ответом Догберта.
Кельвин
5
Я видел, что несколько раз, с неработающими ссылками (символическими ссылками, указывающими на несуществующие файлы), grep пытается найти целевой файл, которого не существует (отсюда и правильное и точное сообщение об ошибке).
Обычно я не беспокоюсь, выполняя задачи sysadmin через консоль, но внутри скриптов я ищу текстовые файлы с помощью команды «find», а затем grep каждый из них:
-Iскачет бинарные файлы - это эквивалентно --binary-files=without-match. Это не подавляет сообщения «Нет такого файла или каталога».
mwfearnley
0
Перенаправить stderrк , stdoutа затем инвертировать матча использовать Grep ( в -v) , чтобы исключить строку предупреждения / ошибки , что я хочу , чтобы скрыть:
grep -r <pattern>*2>&1| grep -v "No such file or directory"
ag
,ack
илиcgrep
вместо этого - они намного быстрее / лучше, чемgrep
для поиска в хранилищах кода.No such file or directory
сообщения для существующих файлов и / или каталогов? Или, наоборот, как можноgrep *
получить имена файлов, которые не существуют? Это условие гонки, когда какой-то другой процесс манипулирует деревом каталогов (создавая, переименовывая и удаляя файлы) во времяgrep
работы?Ответы:
Вы можете использовать флаг
-s
или--no-messages
для подавления ошибок.источник
/bin/ls -1 | xargs grep 'some text'
выдаст вам «нет такого файла или каталога», потому что она разбивает файл «b.txt» на 2 аргумента. Если вы подавите, вы не заметите, что пропустили файл.find
и используюprint0
сxargs -0
Решает ли это проблему? СпасибоЕсли вы просматриваете git-репозиторий, я бы порекомендовал вам использовать
git grep
. Вам не нужно проходить-R
или путь.Это покажет все совпадения из вашего текущего каталога вниз.
источник
Ggrep
поиск также начинается с вершины каталога Git, а не из текущего каталога.Подобные ошибки обычно отправляются в поток «стандартных ошибок», который можно передать в файл или просто заставить исчезнуть в большинстве команд:
источник
Я видел, что несколько раз, с неработающими ссылками (символическими ссылками, указывающими на несуществующие файлы), grep пытается найти целевой файл, которого не существует (отсюда и правильное и точное сообщение об ошибке).
Обычно я не беспокоюсь, выполняя задачи sysadmin через консоль, но внутри скриптов я ищу текстовые файлы с помощью команды «find», а затем grep каждый из них:
Вместо того:
источник
Я обычно не позволяю grep делать рекурсию самостоятельно. Обычно есть несколько каталогов, которые вы хотите пропустить (.git, .svn ...)
Вы можете делать умные псевдонимы с такими позициями:
На первый взгляд это может показаться излишним, но когда вам нужно отфильтровать некоторые шаблоны, это очень удобно.
источник
-exec
до своего grep.\( -name .svn -o -name .git \)
Вы пробовали эту
-0
опцию в xargs ? Что-то вроде этого:источник
find -print0 | xargs -0 grep 'text'
Используйте
-I
в grep.Пример:
grep SEARCH_ME -Irs ~/logs
.источник
-I
скачет бинарные файлы - это эквивалентно--binary-files=without-match
. Это не подавляет сообщения «Нет такого файла или каталога».Перенаправить
stderr
к ,stdout
а затем инвертировать матча использовать Grep ( в-v
) , чтобы исключить строку предупреждения / ошибки , что я хочу , чтобы скрыть:источник