Я пытался использовать grep для нахождения некоторых фрагментов кода в файлах Python, которые распространены по некоторым каталогам / подкаталоги, но к сожалению мои отказавшие попытки :(
Я думал:
grep -r "search-pattern" *.py
должен сделать волшебство, но оно не перестало работать с "никакими соответствиями, найденными", хотя существует несколько файлов, содержащих строки с шаблоном поиска.
Затем я попробовал следующее:
grep -r "search-pattern" .
Который казался обработанному, но также и возвратил много ошибок для некоторых скомпилированных c-файлов и материала. Очевидно, больше, чем я хотел.
Наконец, после многих поисков Google, я придумал:
grep -rn --include="*.py" "search-pattern"
Это сделало задание и нашло все файлы Python, которые я искал. В качестве награды это также печатает номера строки, содержащие шаблон поиска.
Но одна проблема осталась: некоторое "разрешение отклонило" ошибки. Как я избавляюсь от тех? Я думал, обрабатывая grep, будет легко, но это оказалось тем, чтобы быть сложным для получения хороших результатов с нумерацией строк и без ошибок..
Любая справка высоко ценилась бы :)
Вы получаете их 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 доступна, если необходимо попросить у пользователя разрешения.
, не стесняйтесь комментировать под здесь, если Вы имеете больше свойственных вопросов и не забываете нажимать левую Стрелку вверх, если я имею какую-либо справку.
Имеют хороший день.