grep рекурсивно для определенных файлов
Я попытался использовать grep, чтобы найти фрагменты кода в файлах python, которые распространяются на некоторые каталоги / подкаталоги, но, к сожалению, мои попытки не увенчались успехом:(
Я думал:
grep -r "search-pattern" *.py
должен сделать магию, но это не удалось с "не найдено совпадений", хотя есть несколько файлов, содержащих строки с шаблоном поиска.
Далее я попробовал следующее:
grep -r "search-pattern" .
Который, казалось, работал, но также возвратил много ошибок для некоторых скомпилированных c-файлов и прочего. Очевидно, больше, чем я хотел.
Наконец, после многих поисков в Google, я придумал:
grep -rn --include="*.py" "search-pattern"
Это сделало работу и нашел все файлы Python, которые я искал. В качестве бонуса он также печатает номера строк, содержащие шаблон поиска.
Но осталась одна проблема: некоторые "отказано в разрешении" ошибки. Как мне избавиться от них? Я думал, что работать с grep будет легко, но получилось сложно получить хорошие результаты, с нумерацией строк и без ошибок.
Любая помощь будет высоко оценен:)
2 ответа
Вы получаете это Permission denied ошибки, потому что есть некоторые файлы Python, которые у вашего пользователя нет прав на чтение, поэтому grep не работает с этими файлами (вы не можете их искать).
Вы хотите "избавиться" от Permission denied ошибки.
Можете добавить
2>/dev/nullдо конца вашей команды, как это:grep -rn --include="*.py" "search-pattern" 2>/dev/nullЭто подавляет все сообщения об ошибках, поэтому вы не увидите
Permission deniedошибки выскакивают. Но это, очевидно, все еще означает, что grep не ищет эти файлы, поэтому, если они содержат ваш шаблон поиска, вы не увидите их в выводе.Пояснение:
В Linux есть три вещи, называемые дескрипторами файлов:stdin,stdout,stderr, Если вы запускаете команду, и она выдает ошибку, ошибка записывается в дескриптор файлаstderr, По умолчанию,stderrвыводит ошибки в терминал. Итак, что мы можем сделать, это перенаправить ошибки, то есть мы перенаправитьstderrгде-то еще вместо терминала. Мы перенаправляем вещи в Linux, используя>знак. Так куда мы будем перенаправлятьstderr? к/dev/null,/dev/nullэто специальный файл; думать об этом как о черной дыре. Все, что вы перенаправляете на это, выбрасывается. Наконец, мы ссылаемся наstderrпросто число2, Так2>/dev/nullговорит Linux перенаправить2в/dev/null,1средстваstdout(который является нормальным выводом команды, то есть не ошибками). Так, например, если вы хотите сохранить фактический вывод вашей команды grep в файл, а не отображать его в терминале, вы можете использовать1>/path/to/filename, который будет перенаправлятьstdoutв этот файл.использование
sudoс вашей командой, предполагая, что у вас есть права:sudo grep -rn --include="*.py" "search-pattern"Если ваше имя пользователя имеет привилегии root (то есть, если вы являетесь администратором на машине), используйте
sudoдо запуска команды от имени пользователя root, поэтому вы никогда не получитеPermission deniedошибки и grep будут искать эти файлы и выводить шаблон поиска, если он найдет его внутри них.
Это распространенная проблема, вы можете решить ее прямо из командной строки.
Ты можешь использовать --devices=skip игнорировать специальные файлы устройства (источник ошибок и бесконечные циклы во многих системах).
казнить sudo chown -R new_owner_name file_pattern рекурсивно изменить владельца файла и избежать ошибок разрешения.
Если вы перенаправите поток ошибок с COMMAND 2> DESTINATION_OR_/dev/null ошибки все еще случаются, и вы не получите желаемых результатов от grep.
Если возможно, никогда не используйте sudo Чтобы автоматически выполнить анализ (это может быть слабым местом системы), попробуйте изменить владельца файла при необходимости. Графическая версия sudo доступна, если вам нужно запросить разрешение у пользователя.
Пожалуйста, не стесняйтесь комментировать здесь, если у вас есть дополнительные вопросы и не забудьте нажать левую стрелку вверх, если я вам помогу.
Хорошего дня.