как искать текст по всей файловой системе?

<p>предполагая, что следует использовать инструмент grep, я бы хотел найти текстовую строку "800x600" во всей файловой системе.</p><p>я старался:</p><pre><code>grep -r 800x600 / </code></pre><p>но это не работает.</p><p>я считаю, что моя команда должна делать рекурсивно grep через все файлы/папки в корневом каталоге для текста "800x600" и выводить результаты поиска.</p><p>что я делаю неправильно?</p>

<p>обычно я использую этот стиль команды для запуска <code>grep</code> над несколькими файлами:</p><pre><code>find / -xdev -type f -print0 | xargs -0 grep -h "800x600" </code></pre><p>на самом деле это составляет список всех файлов в системе, а затем для каждого файла выполняет <code>grep</code> с заданными аргументами и именем каждого файла.</p><p><code>-xdev</code> аргумент сообщает find, что он должен игнорировать другие файловые системы - это хорошо для того, чтобы избегать специальных файловых систем, таких как <code>/proc</code>. однако он также будет игнорировать обычные файловые системы - поэтому, если, например, ваша папка/home находится в другом разделе, она не будет искать - вам нужно будет сказать <code>find / /home -xdev ...</code>.</p><p><code>-type f</code> означает поиск только по файлам, поэтому каталоги, устройства и другие специальные файлы игнорируются (он все равно будет возвращаться в каталоги и выполнять <code>grep</code> для файлов внутри - он просто не будет выполнять <code>grep</code> на самом каталоге, который не будет работать в любом случае). и <code>-h</code> опция <code>grep</code> говорит ему всегда печатать имя файла при выводе.</p><p><code>find</code> принимает всевозможные опции для фильтрации списка файлов. например, <code>-name '*.txt'</code> обрабатывает только файлы, заканчивающиеся на .txt. <code>-size -2m</code> означает файлы размером менее 2 мегабайт. <code>-mtime -5</code> означает файлы, измененные за последние пять дней. соедините их вместе с -a для <em>и</em> и -o для <em>или</em> и используйте <code>'('</code> скобки <code>')'</code> для группировки выражений (в кавычках, чтобы оболочка не могла их интерпретировать). так, например:</p><pre><code>find / -xdev '(' -type f -a -name '*.txt' -a -size -2m -a -mtime -5 ')' -print0 | xargs -0 grep -h "800x600" </code></pre><p>взгляни на <code>man find</code>, чтобы увидеть полный список возможных фильтров.</p>

<p>обычно вы не захотите искать все в системе. linux использует файловые узлы для всего, поэтому некоторые "файлы" - это не те вещи, которые вы хотели бы искать. например <code>/dev/sda</code> - это физическое блочное устройство для вашего первого жесткого диска. вы, вероятно, хотите искать в смонтированных файловых системах, а не на сыром дисковом устройстве. также есть <code>/dev/random</code>, который выдает случайные данные каждый раз, когда вы их читаете. поиск, который не имеет большого смысла. <code>/proc</code> файловая система также проблематична в вашем случае.</p><p>я бы порекомендовал одну из двух вещей.</p><ol> <li> <p>не ищите в корне, ищите только места, которые могут быть полезны. поиск <code>/home</code> или <code>/usr</code> или <code>/etc</code> отдельно информация, которую вы ищете, скорее всего, относится к определенному типу, так что, скорее всего, она будет в определенной папке. настройки конфигурации должны быть в <code>/etc</code>. ваши личные данные должны быть в <code>/home</code>. ограничение поиска основной областью, подобной этой, значительно уменьшит ваши проблемы с рекурсивными программами.</p> </li> <li> <p>исключите проблемные области, используя <code>--exclude-dir</code> и набор вещей, которые, как вы знаете, вам не нужны, вот так:<br> <code>grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found</code></p> </li> </ol><p>наконец, нередки случаи, когда при выполнении большого рекурсивного grep встречается несколько ошибок с отказом в разрешении. при обычном использовании есть файлы, которые ваш пользователь может не прочитать. пока это всего лишь несколько нечетных файлов, а не такие вещи, как необработанное устройство для ваших жестких дисков или всей файловой системы proc, можно просто игнорировать ошибки. на самом деле вы можете сделать это в командной строке, отправив все ошибки никогда не приземляясь:</p><pre><code>grep -r search\_string /path 2> /dev/null </code></pre>

<p>для простоты я бы предложил <a href="http://betterthangrep.com/">ack-grep</a> . ссылка показывает много случаев, когда <code>ack-grep</code> это лучший вариант.</p><p>для использования есть, после установки:</p><pre><code>ack-grep pattern / </code></pre>

<p>другой способ взглянуть на это так:</p><pre><code>grep -r /* | grep "800x600" </code></pre>

<p>* тогда я получаю/proc/sysrq-trigger: ошибка ввода/вывода</p><p>ваша команда работает, вы получаете эту ошибку, потому что вы пытаетесь сканировать запущенные процессы на наличие строки.</p><p>я рекомендую исключить системные каталоги с</p><p>grep -exclude-dir = {proc, sys} "800x600" /</p>