grep рекурсивно для определенных файлов

Я пытался использовать grep для нахождения некоторых фрагментов кода в файлах Python, которые распространены по некоторым каталогам / подкаталоги, но к сожалению мои отказавшие попытки :(

Я думал:

grep -r "search-pattern" *.py

должен сделать волшебство, но оно не перестало работать с "никакими соответствиями, найденными", хотя существует несколько файлов, содержащих строки с шаблоном поиска.

Затем я попробовал следующее:

grep -r "search-pattern" .

Который казался обработанному, но также и возвратил много ошибок для некоторых скомпилированных c-файлов и материала. Очевидно, больше, чем я хотел.

Наконец, после многих поисков Google, я придумал:

grep -rn --include="*.py" "search-pattern"

Это сделало задание и нашло все файлы Python, которые я искал. В качестве награды это также печатает номера строки, содержащие шаблон поиска.

Но одна проблема осталась: некоторое "разрешение отклонило" ошибки. Как я избавляюсь от тех? Я думал, обрабатывая grep, будет легко, но это оказалось тем, чтобы быть сложным для получения хороших результатов с нумерацией строк и без ошибок..

Любая справка высоко ценилась бы :)

5
задан 7 November 2014 в 01:05

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 будут искать те файлы и производить шаблон поиска, если он найдет его в них.

3
ответ дан 17 November 2019 в 11:44

Это - типичная проблема, можно решить его непосредственно из командной строки.
можно использовать --devices=skip для игнорирования файлов специального устройства (источник ошибок и бесконечных циклов во многих системах).
Выполняются sudo chown -R new_owner_name file_pattern, чтобы изменить принадлежность файла рекурсивно и избежать ошибок разрешения.
при перенаправлении потока сообщений об ошибках с COMMAND 2> DESTINATION_OR_/dev/null ошибки все еще происходят, и Вы не получите желаемые результаты grep.
, Если возможно никогда не используют sudo автоматически , чтобы сделать анализ (это может быть слабое место системы), попытайтесь изменить принадлежность файла при необходимости. Графическая версия sudo доступна, если необходимо попросить у пользователя разрешения.

, не стесняйтесь комментировать под здесь, если Вы имеете больше свойственных вопросов и не забываете нажимать левую Стрелку вверх, если я имею какую-либо справку.
Имеют хороший день.

1
ответ дан 17 November 2019 в 11:44

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

Похожие вопросы: