Предполагая, что следует использовать инструмент grep, я бы хотел найти текстовую строку «800x600» во всей файловой системе.
Я пытался:
grep -r 800x600 /
но это не работает
Я считаю, что моя команда должна делать рекурсивно grep через все файлы / папки в корневом каталоге для текста «800x600» и выводить результаты поиска.
Что я делаю неправильно?
Permission denied
ошибок? Вы запускали его как root или обычный пользователь?grep -r 800x600 / 2>/dev/null
. Вы также можете попробовать запустить его как root.Ответы:
Обычно я использую этот стиль команд для запуска
grep
нескольких файлов:На самом деле это составляет список всех файлов в системе, а затем для каждого файла выполняется
grep
с заданными аргументами и именем каждого файла.-xdev
Аргумент говорит находке , что он должен игнорировать другие файловые системы - это хорошо для избежания специальных файловых систем , таких как/proc
. Однако он также будет игнорировать обычные файловые системы - поэтому, если, например, ваша папка / home находится в другом разделе, она не будет искать - вам нужно будет сказатьfind / /home -xdev ...
.-type f
означает поиск только файлов, поэтому каталоги, устройства и другие специальные файлы игнорируются (он все равно будет преобразовываться в каталоги и выполнятьсяgrep
в файлах внутри - он просто не будет выполнятьсяgrep
в самом каталоге, что в любом случае не будет работать). И-H
опцияgrep
сказать ему всегда печатать имя файла в его выводе.find
принимает все виды опций для фильтрации списка файлов. Например,-name '*.txt'
обрабатывает только файлы, заканчивающиеся на .txt.-size -2M
означает файлы размером менее 2 мегабайт.-mtime -5
означает файлы, измененные за последние пять дней. Объедините их вместе с -a for и и -o for или и используйте'('
скобки')'
для группировки выражений (в кавычках, чтобы оболочка не могла их интерпретировать). Так, например:Взгляните,
man find
чтобы увидеть полный список возможных фильтров.источник
-xdev
будут исключены все другие файловые системы, а не только специальные. (например, если вы/home
смонтировали отдельный раздел, он не будет найден.)find: paths must precede expression: /
xargs
возможно, большей эффективности, делаяfind / -xdev -type f -exec grep -H '800x600' +
.+
знак в концеfind
команды фактически делает то же самоеxargs
: он порождает одинgrep
процесс с несколькими аргументами.Обычно вы не захотите искать ВСЕ в системе. Linux использует файловые узлы для всего, поэтому некоторые «файлы» - это не те вещи, которые вы хотели бы искать. Например,
/dev/sda
это физическое блочное устройство для вашего первого жесткого диска. Вы, вероятно, хотите искать в смонтированных файловых системах, а не на устройстве с необработанным диском. Также есть то,/dev/random
что выплевывает случайные данные каждый раз, когда вы читаете их. Поиск, который не имеет большого смысла./proc
Файловая система также является проблематичной в вашем случае.Я бы порекомендовал одну из двух вещей.
Не ищите в корне, ищите только места, которые могут быть полезны. Поиск
/home
или/usr
или/etc
отдельно. Информация, которую вы ищете, скорее всего, относится к определенному типу, так что, скорее всего, она будет в определенной папке. Настройки конфигурации должны быть в/etc
. Ваши личные данные должны быть в/home
. Ограничение поиска основной областью, подобной этой, значительно уменьшит ваши проблемы с рекурсивными программами.Исключите использование проблемных областей
--exclude-dir
и набор вещей, которые, как вы знаете, вам не нужны, вот так:grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found
Наконец, нередки случаи, когда при выполнении большого рекурсивного grep встречается несколько ошибок с отказом в разрешении. При обычном использовании есть файлы, которые ваш пользователь может не прочитать. Пока это всего лишь несколько нечетных файлов, а не такие вещи, как необработанное устройство для ваших жестких дисков или всей файловой системы proc, можно просто игнорировать ошибки. На самом деле вы можете сделать это в командной строке, отправив все ошибки никогда не приземляясь:
источник
-I
исключить двоичный файлДля простоты я бы предложил ack-grep . Ссылка показывает много случаев, когда
ack-grep
это лучший вариант.Для использования есть, после установки:
источник
Другой способ взглянуть на это так:
источник
* тогда я получаю / proc / sysrq-trigger: Ошибка ввода / вывода
Ваша команда работает, вы получаете эту ошибку, потому что вы пытаетесь сканировать запущенные процессы на наличие строки.
Я рекомендую исключить системные каталоги с
grep -exclude-dir = {proc, sys} "800x600" /
источник
просто правильно
-Что не так в вашей текущей команде - это кавычки "". Всегда помещайте строковый аргумент
grep
в кавычки.источник
grep
. Попробуйте, и вы увидите. Поместите строку "800x600" в файл, а затем,grep 800x600 file
и вы увидите, что она работает просто отлично. У ОП явно другая проблема.