Скрипт для поиска файлов с определенным расширением, но НЕ содержащий конкретный текст

Я пытаюсь написать сценарий, который в основном ищет рекурсивно, используя find (или другой метод), чтобы найти все файлы, заканчивающиеся на * .p или * .w, но не содержит sysvars.i или preprocess.i

Я новичок в написании сценариев и приветствую любую помощь, найду лучшую команду для использования и т. Д.?

Вы можете комбинировать действия find и grep чтобы выполнить это:

 find /search/path/ -type f \( -name '*.p' -or -name '*.w' \) \ -exec grep -L -e 'sysvars.i' -e 'preprocess.i' {} + 

Давайте сломаем это.

  • find /serch/path возвращает все файлы по указанному пути. Далее нам нужно сузить это, начиная с вещей, которые сначала устранят большинство матчей, чтобы сэкономить время, проверяя другие вещи позже.
  • -type f возвращает только файлы. Если у вас были каталоги, соответствующие шаблону имени файла, мы не хотим отправлять их в grep .
  • \( [expr1] -or [expr2] \) создает либо / или совпадение, так что find возвращает файлы, которые соответствуют либо expr1, либо expr2, но нет причин, по которым он должен совпадать. Скобки помогают разделить это или группу на остальные параметры соответствия, которые на самом деле и требования.
  • -name '*.p' и -name '*.w' довольно очевидны, возвращают файлы, соответствующие этим шаблонам имен.
  • -exec command {} + будет запускать указанную команду, а любые аргументы с битом {} заменены аргументами для каждого файла, согласованного с остальной частью команды find . Функция -exec предпочтительнее использовать xargs или xargs в цикле, потому что так хорошо справляется с цитированием и именами файлов.
  • grep используется для поиска шаблона в указанных файлах.
    • -L используется для возврата только списка имен файлов, у которых нет совпадений
    • -e 'PATTERN' указан дважды, чтобы указать две строки поиска, которые вы не хотели сопоставлять.

Можно построить сложные булевы выражения для поиска:

 find . \( -name '*.p' -or -name '*.w' \) -and \ -not \( -name 'sysvars.i' -or -name 'preprocess.i' \) 

Имена опций, совместимых с Posix, равны -a , -o и ! вместо -and , -or и -not .

Если вам нужно искать строки в содержимом файлов, то вы должны использовать find вместе с grep (например).