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 ошибки.

  1. Можете добавить 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 в этот файл.

  2. использование 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 доступна, если вам нужно запросить разрешение у пользователя.

Пожалуйста, не стесняйтесь комментировать здесь, если у вас есть дополнительные вопросы и не забудьте нажать левую стрелку вверх, если я вам помогу.
Хорошего дня.

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