Как перебрать все файлы в текущем и подкаталогах, чтобы найти строку?

Короткий ответ: :Ntpd заменен на chronyd в качестве демона NTP по умолчанию в RHEL 7. Это другая реализация, которая способна синхронизировать системные часы быстрее и с большей точностью.

Длинный ответ: :Согласно Red Hat Solution 2070363

Chrony should be preferred for all systems except for the systems that are managed or monitored by tools that do not support chrony, or the systems that have a hardware reference clock which cannot be used with chrony.

и документация «Настройка NTP с помощью chrony Suite » обсуждает «Различия между ntpd и chronyd ».

0
21.10.2021, 17:56
2 ответа

Что-то, что будет работать во всех современных системах Unix, — это использовать findдля поиска файлов, а затем grepдля идентификации файлов, содержащих строкуfoo:

find. -type f -exec grep -l -F -e 'foo' {} +

Приведенная выше команда найдет все обычные файлы в текущем каталоге или ниже него. Для пакетов найденных файлов будет вызываться grep, чтобы найти строку foo. При нахождении строки в файле grepнемедленно выводит путь к файлу и продолжает работу со следующим файлом, не читая дальше текущий файл.

  • Мы используем -l, чтобы заставить grepостановиться и сообщить имя файла в первой строке, соответствующее данному шаблону. Это ускоряет обработку, игнорируя бит файла после первого попадания.
  • Мы используем -F, чтобы заставить grepсчитать шаблон строкой, а не регулярным выражением. Это потенциально ускоряет обработку, не пытаясь найти совпадения с регулярными выражениями, и позволяет нам сопоставлять строки, которые выглядят как регулярные выражения.
  • Мы используем -eс данным шаблоном, на тот случай, если он начинается с дефиса. В данном случае этого не происходит, но замена этой статической строки fooпеременной даст возможность сопоставления с шаблоном, начинающимся с дефиса, который, следовательно, будет ошибочно принят за командную строку -вариант.

Однако список имен файлов обычно бесполезен. Вероятно, вы захотите что-то сделать с этими файлами. Если это так, вы должны сделать это как часть утилиты, которая findвыполняется через -exec:

.
find. -type f -exec sh -c '
    for pathname do
        grep -q -F -e "foo" "$pathname" || continue
        # Do something with "$pathname" here
    done' sh {} +

Здесь мы вызываем скрипт с короткой строкой -для пакетной обработки найденных файлов. Мы проверяем каждый файл отдельно на наличие строки fooи игнорируем файлы, не содержащие строку. Там, где я добавил комментарий в скрипте строки -, вы должны обработать файл, на который ссылается "$pathname".

Вы также можете написать вышеприведенное с findвыполнением grepотдельно перед вызовом встроенного скрипта -:

find. -type f -exec grep -q -F -e 'foo' {} \; -exec sh -c '
    for pathname do
        # Do something with "$pathname" here
    done' sh {} +

Обратите внимание, что первый -execдействует как тест для текущего файла перед вызовом sh -cс файлами, прошедшими этот тест.

1
21.10.2021, 20:59

Я считаю, что утилита ackсделает именно то, что вам нужно. Возможно, он уже установлен в вашей системе. Если нет, то его можно скачать с https://beyondgrep.com/.

Одной из приятных особенностей ackявляется то, что он по умолчанию игнорирует двоичные файлы и может иметь параметры командной строки для ограничения типов файлов, которые ищутся с помощью определенного фильтра или типа файла (, например. по языку программирования:--type=ccбудет искать .c, .h, .xsфайлы, --type=awkбудет искать любые файлы, которые соответствуют /awk/в первой строке ). Эти типы также могут быть расширены пользователем в командной строке или более постоянно в файле ~/.ackrc.

0
21.10.2021, 21:46

Теги

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