Rga:Ripgrep,但也可以搜索PDF,电子书,Office文档,zip,tar.gz

2020-12-04 20:42:46

rga是一种面向行的搜索工具,使您可以在多种文件类型中查找正则表达式。 rga封装了很棒的ripgrep,并使其能够搜索pdf,docx,sqlite,jpg,zip,tar。*,电影字幕(mkv,mp4)等。

假设您有一大堆文件或演讲幻灯片,却不记得其中哪一个提到了GRU。使用rga,您可以运行以下命令:

〜$ rga" GRU" slides / slides / 2016 / winter1516_lecture14.pdf第34页:GRU LSTM第35页:GRU CONV第38页:-试试GRU-RCN! (imo最佳模型)slides / 2018 / cs231n_2018_ds08.pdf第3页:●CNN,GAN,RNN,LSTM,GRU第35页:●1)时间池2)RNN(例如LSTM,GRU)slides / 2019 / cs231n_2019_lecture10.pdf第103页:GRU [使用rnnPage 105学习短语表示形式:-通用使用LSTM或GRU

它将在pdfs中递归地找到一个字符串,包括其中一些是否已压缩。

您可以使用pdfgrep -r进行几乎相同的操作,但是会丢失其他文件类型的内容,并且速度会慢得多:

第一次运行时,由于多线程,rga的运行速度通常会更快,但是在后续运行中(具有相同的文件,但使用任何正则表达式查询),rga会缓存文本提取,因此它的速度几乎与在纯文本文件中搜索一样快。所有运行都使用温暖的FS缓存完成。

rga将递归地归入存档,并在它知道的每种文件类型中匹配文本。

演示├──Greeting.mkv├──hello.odt├──hello.sqlite3└──somearchive.zip├──dir│├──greeting.docx│└──inner.tar.gz│└── .pdf└──greeting.epub

〜$ rga" hello" demo / demo / greeting.mkvmetadata:chapters.chapter.0.tags.title ="第1章:Hello" 00:08.398- 00:11.758:你好,电影! demo / hello.odt您好,来自OpenDocument文件! demo / hello.sqlite3tbl:greeting ='你好,来自== sqlite数据库!' demo / somearchive.zipdir / greeting.docx:来自MS Office文档的您好!dir / inner.tar.gz:greeting.pdf:第1页:来自PDF的您好!greeting.epub:来自电子书的您好!

它甚至可以使用OCR搜索jpg / png图像和扫描的pdf,尽管默认情况下此功能处于禁用状态,因为它通常没有用,而且速度非常慢。

〜$#查找crates.io的屏幕快照〜$ rga板条箱〜/ screenshots --rga-adapters = + pdfpages,tesseract屏幕快照/2019-06-14-19-01-10.png crates.io我浏览所有板条箱文档vDocumentation仓库相关的板条箱〜$#到了!

GitHub版本中提供了Linux,Windows和OSX二进制文件。有关更多信息,请参见自述文件。

rga-preproc [fname]将匹配" adapter"根据文件名或哑剧类型(如果提供了--rga-accurate)添加到给定文件。您可以看到src / adapters中当前包含的所有适配器。

某些rga适配器运行外部二进制文件来完成实际工作(例如pandoc或ffmpeg),通常是通过写stdin并从stdout读取来完成。其他人则使用Rust库或绑定来达到相同的效果(例如sqlite或zip)。

要读取存档,将使用zip和tar库,它们以流方式完全工作-这意味着RAM使用率很低,并且实际上没有数据提取到磁盘上!

大多数适配器从读取中读取文件,因此它们可以完全处理流数据(可以来自任何地方,包括嵌套存档中的数据)。

在提取过程中,rga-preproc将使用ZSTD将数据压缩到内存缓存,同时将未压缩的数据写入stdout。完成后,如果内存缓存小于2 MB,则将其写入rkv缓存。缓存由(适配器,文件名,mtime)作为键,因此,如果文件发生更改,则会再次提取其内容。

我想添加一个照片适配器(基于对象分类/检测)来娱乐,所以您可以grep表示" mountain"它将显示山脉的图片,就像在Google相册中一样。它与YOLO一起使用,但是类似这样的更有用和最新的技术却很难集成。

也许使用另一个磁盘kv-store而不是rkv作为缓存,因为我对此有一些奇怪的问题。 SQLite很棒。我发现的所有其他Rust替代方法都不允许从多个进程进行写入。

我不知道如何解决的代码中还有其他一些(大多数是技术性的)待办事项。把招工广告。

这个要点有我的概念证明版本的缓存提取器,可以使用ripgrep代替pdfgrep。

lesspipe是一种减少使用许多不同文件类型的工具。 不同的用例,但用途相似。