Как к искомому тексту всюду по целой файловой системе?

Это - просто плохая идея, поскольку нет никакого способа сказать различие между жесткой ссылкой и настоящим именем.

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

Во-первых, для понимания этого давайте говорить о inodes. Данные в файловой системе сохранены в блоках на диске, и те блоки собраны вместе inode. Можно думать о inode как о файле.   Inodes испытывают недостаток в именах файлов, все же. Это - то, где ссылки входят.

Ссылка является просто указателем на inode. Каталог является inode, который содержит ссылки. Каждое имя файла в каталоге является просто ссылкой на inode. Открытие файла в Unix также создает ссылку, но это - другой тип ссылки (это не именованная ссылка).

Жесткая ссылка является просто дополнительной записью каталога, указывающей на это inode. Когда Вы ls -l, число после полномочий является именованным числом каналов. Большинство регулярных файлов будет иметь одну ссылку. Создание новой жесткой ссылки на файл заставит оба имен файлов указать на тот же inode.Примечание:

% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r--  1 danny  staff  0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
-rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3
            ^
            ^ this is the link count

Теперь, можно ясно видеть, что нет такой вещи как жесткая ссылка. Жесткая ссылка совпадает с регулярным именем. В вышеупомянутом примере, test или test2, который является исходным файлом и который является жесткой ссылкой? К концу Вы не можете действительно сказать (даже метками времени), потому что оба имени указывают на то же содержание, тот же inode:

% ls -li test*  
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
14445892 -rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3

-i флаг к ls шоу Вы inode числа в начале строки. Отметьте как test и test2 имейте то же inode число, но test3 имеет другой.

Теперь, если бы Вам разрешили сделать это для каталогов, то два различных каталога в различных точках в файловой системе могли указать на то же самое. На самом деле subdir мог указать назад своему прародителю, создав цикл.

Почему этот цикл является беспокойством? Поскольку, когда Вы пересекаете, нет никакого способа обнаружить Вас, цикличное выполнение (не отслеживая inode числа, поскольку Вы пересекаете). Предположите, что Вы пишете du команда, которая должна рекурсивно вызвать через subdirs для обнаружения об использовании диска. Как был бы du знайте, когда это поразило цикл? Это подвержено ошибкам и большая бухгалтерия это du должен был бы сделать, только для осуществления этой простой задачи.

Символьные ссылки являются совершенно другим зверем, в этом они - специальный тип "файла", за которым много API файловой системы файла имеют тенденцию автоматически следовать. Отметьте, символьная ссылка может указать несуществующему месту назначения, потому что они указывают по имени, и не непосредственно к inode. То понятие не имеет смысла с жесткими ссылками, потому что простое существование "жесткой ссылки" означает, что файл существует.

Итак, почему может du соглашение с символьными ссылками легко и не жесткими ссылками? Мы смогли видеть выше этого, жесткие ссылки неотличимы от нормальных записей каталога. Символьные ссылки, однако, являются особенными, обнаруживаемыми, и skippable! du уведомления, что символьная ссылка является символьной ссылкой и пропускает ее полностью!

% ls -l 
total 4
drwxr-xr-x  3 danny  staff  102 Oct 13 18:14 test1/
lrwxr-xr-x  1 danny  staff    5 Oct 13 18:13 test2@ -> test1
% du -ah
242M    ./test1/bigfile
242M    ./test1
4.0K    ./test2
242M    .
55
06.07.2011, 15:22
7 ответов

Я обычно использую этот стиль команды для выполнения grep по многим файлам:

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

То, что это на самом деле делает, входят в список каждого файла в системе, и затем для каждого файла, выполняются grep с данными аргументами и названием каждого файла.

-xdev аргумент говорит, находят, что он должен проигнорировать другие файловые системы - это хорошо для предотвращения специальных файловых систем такой как /proc. Однако это также проигнорирует нормальные файловые системы также - поэтому, если, например, Ваш / домашняя папка будет на другом разделе, то это не будет искаться - необходимо было бы сказать find / /home -xdev ....

-type f поиск средств регистрирует только, таким образом, каталоги, устройства и другие специальные файлы проигнорированы (он все еще рекурсивно вызовет в каталоги и выполнится grep на файлах в - это просто не выполнится grep на самом каталоге, который не работал бы так или иначе). И -H опция к grep говорит этому всегда печатать имя файла в своем выводе.

find принимает все виды опций отфильтровать список файлов. Например, -name '*.txt' процессы только файлы, заканчивающиеся в .txt. -size -2M файлы средств, которые меньше, чем 2 мегабайта. -mtime -5 файлы средств изменяются за прошлые пять дней. Присоединитесь к ним вместе с-a для и и-o для или, и использование '(' круглые скобки ')' к выражениям группы (в кавычках, чтобы препятствовать тому, чтобы оболочка интерпретировала их). Так, например:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

Смотрите на man find видеть полный список возможных фильтров.

67
27.01.2020, 19:33
  • 1
    Отметьте это -xdev исключит все другие файловые системы, не только специальные. (например, если Вы имеете /home смонтированный как отдельный раздел, это не будет искаться.) –  cjm 06.07.2011, 11:29
  • 2
    я пытался работать, каждый, но оба возвращает ошибку- find: paths must precede expression: / –  Level1Coder 06.07.2011, 11:36
  • 3
    : Когда регулярные выражения не требуются, 'fgrep' значительно быстрее, чем 'grep', который будет иметь большое значение, если Вы будете искать большое дерево. –  Nathan Kidd 06.07.2011, 21:56
  • 4
    Можно постараться не проходить xargs с, возможно, лучшей эффективностью путем выполнения find / -xdev -type f -exec grep -H '800x600' +. –  Totor 26.01.2014, 03:31
  • 5
    Нет, + знак в конце find команда на самом деле делает то же самое как xargs: это порождает тот grep процесс с несколькими аргументами. –  Totor 27.01.2014, 14:58

Обычно Вы не хотели бы на самом деле искать ВСЕ в системе. Linux использует узлы файла для всего, таким образом, некоторые "файлы" не являются вещами, Вы хотели бы искать. Например, /dev/sda физическое блочное устройство для Вашего первого жесткого диска. Вы, вероятно, хотите искать смонтированные файловые системы не устройство неструктурированного диска. Также существует /dev/random который выкладывает случайные данные каждый раз, когда Вы читаете их. Поиск, который не имеет большой смысл. /proc файловая система также проблематична в Вашем случае.

Я рекомендовал бы одну из двух вещей.

  1. Не ищите в корне, только ищите места, которые могли бы быть полезными. Поиск /home или /usr или /etc separatly. Информация, которую Вы ищете, вероятно, имеет определенный тип, таким образом, это, вероятно, будет в определенной папке так или иначе. Параметры конфигурации должны быть в /etc. Ваши файлы персональных данных должны быть в /home. Ограничение поиска к главной области как это значительно уменьшит Ваши проблемы с рекурсивными властями.

  2. Исключите проблематичное использование областей --exclude-dir и ряд вещей, Вы знаете Вас, не делает подобный потребности это:
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

Наконец, весьма распространено натыкаться на несколько 'отклоненных разрешением' ошибок при выполнении большого рекурсивного grep. В нормальном ходе использования существуют файлы, которые Ваш пользователь не может читать. Пока это всего несколько нечетных файлов и не вещей как неструктурированное устройство для Ваших жестких дисков или всей proc файловой системы, нормально просто игнорировать ошибки. На самом деле можно сделать это на командной строке путем отправки всех ошибок в никогда никогда землю:

grep -r search_string /path 2> /dev/null
15
27.01.2020, 19:33

Для простоты я предложил бы ack-grep. Ссылка показывает много случаев когда ack-grep более оптимальный вариант.

Использовать после установки:

ack-grep pattern /
3
27.01.2020, 19:33
  • 1
    Спасибо за рекомендацию этого, но я выполнил это, и она действительно не дала мне результаты поиска, которые я ожидал. Кажется, что я должен буду настроить много настроек для получения то, что я хочу. На данный момент ответ Richard работает правильно из поля. Изучит это в будущем, поскольку это кажется полезным также. –  Level1Coder 06.07.2011, 20:30

просто правильно-

grep -r "800x600" /

-Что не так в вашей текущей команде, так это кавычки "". Всегда помещайте строковый аргумент для grep в кавычки.

-4
27.01.2020, 19:33

Другой способ взглянуть на это так:

grep -r /* | grep "800x600"
2
27.01.2020, 19:33

* затем я получаю триггер /proc/sysrq -:Ошибка ввода/вывода

Ваша команда работает. Вы получаете эту ошибку, потому что пытаетесь сканировать запущенные процессы на наличие строки.

Я рекомендую исключать системные каталоги с

grep --exclude-dir={proc,sys}  "800x600" /
0
27.01.2020, 19:33

Если вы хотите запустить поиск текста только в файлах, соответствующих определенному шаблону имени (, например. .txtфайлы )можно сделать:

grep -rlw --include="*.txt" -e "text to search" path/to/dir

Опустите параметр w, если вы также хотите найти файлы, в которых искомый текст является подстрокой содержимого файла.

1
29.09.2021, 13:08

Теги

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