windows - 在文件中搜索子字符串,但只检查前几个字符
问题描述
我有一个要搜索的关键字列表,例如FOO, BAR, BAZ
,以及大量各种大小的文件,其中可能包括文件开头的上述关键字之一。这样的文件可能如下所示:
AAA:+.? 'BBB+1234567890000+9999999999999+FOO'CCC+...
这些是'
- 分隔的段。我要搜索的关键字只能出现在第二段(BBB
-part)中,所以我可以分割'
或只搜索前 100 个字节左右。它不必精确,误报也不是问题。
默认情况下,我只能使用 Windows 上可用的工具,所以我认为 Powershell 是最好的选择。我可以使用Select-String执行全文搜索,但鉴于许多文件的大小非常大,为了获得可接受的性能,我不希望读取整个文件。
如何在不对每个文件的全部内容执行全文搜索的情况下找到所有开头包含任何给定关键字集的文件?
解决方案
我能够通过手动迭代所有文件来解决我的问题,只读取几个字节(我需要分析的文件是 ASCII,如果它们是 unicode,这可能不适用于所有情况),并查看它是否匹配
$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)";
}
}
}
推荐阅读
- browser - 浏览器代码执行的可能方法
- angular - angular7输入类型文件上传不起作用
- reactjs - 如何使用 React Redux 在 Reducer ADD_TO_CART 中添加产品项目的数量
- javascript - 想要在模态/弹出正文中添加十字图标或关闭按钮以关闭模态
- automated-tests - 如何在 testcafe 中减小鼠标指针的大小
- java - ConcurrentHashMap的addCount函数(JDK1.8或更高版本)如何实现条件(sc == rs + 1 || sc == rs + MAX_RESIZERS)
- image - 用于 45 度线的 OpenCV 线检测
- c++ - 要求约束必须评估为布尔值。所以没有 SFINAE
- javascript - 检查元素是否在javascript中创建
- ruby - 如何查看 `Rack::Protection` 对 Sinatra 服务器所做的工作?