Искать подстроки в файлах, но проверять только первые несколько символов - PullRequest
0 голосов
/ 06 мая 2020

У меня есть список ключевых слов, по которым я хочу искать, например, FOO, BAR, BAZ, и большое количество файлов различного размера, которые могут включать одно из вышеупомянутых ключевых слов в самом начале файла. Такой файл может выглядеть так:

AAA:+.? 'BBB+1234567890000+9999999999999+FOO'CCC+...

Это сегменты, разделенные '. Ключевые слова, которые я хочу найти, могут встречаться только во втором сегменте (часть BBB), поэтому я мог либо разделить их на ', либо просто выполнить поиск в первых 100 байтах или около того. Это не обязательно должно быть точным, и ложные срабатывания тоже не вызывают беспокойства.

Я ограничен использованием инструментов, доступных на Windows по умолчанию, поэтому я предположил, что Powershell - лучший способ go . Я мог бы выполнить полнотекстовый поиск, используя Select-String , но, учитывая, что многие файлы имеют очень большой размер, для обеспечения приемлемой производительности я не хочу, чтобы читался весь файл.

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

1 Ответ

0 голосов
/ 06 мая 2020

Мне удалось решить свою проблему, вручную перебирая все файлы, прочитав только пару байтов (файлы, которые мне нужно проанализировать, - это ASCII, если бы они были юникодом, это, вероятно, не сработает для всех случаев) и посмотрите если он соответствует

$keywords = @("FOO", "BAR", "BAZ")

Get-ChildItem -Path "*.*" -Recurse | Foreach-Object {
    # only read 500 bytes. needs byte encoding as -TotalCount otherwise gets interpreted as number of lines
    $bytes = Get-Content $_.FullName -Encoding byte -TotalCount 500
    # turn content back into string
    $content = [char[]]($bytes) -join ''

    $keywords | Foreach-Object {
        if ($content -match $_) {
            Write-Output "$($_): $($_.FullName)";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...