Ruby中文件名中包含特殊字符的高效文件匹配

gblwokeq  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(141)

我正在开发一个Ruby应用程序,其中涉及大量的文本文件(数量以百万计)。这些文件中的每一个都被称为两个字符的字符串,它可以包括常规的字母数字字符和特殊字符。以下是几个例子:
文件名ab.txt(无特殊字符)
文件名**-B**(第一个字符是特殊字符)
文件名**%!.txt**(两个字符均为特殊字符)
我面临的任务是根据输入文本有效地选择这些文件的子集。当用户输入两个字符的字符串时,应用程序必须选择所有目录中名称与该字符串对应的所有文件。
我尝试使用正则表达式模式和glob来直接搜索感兴趣的文件。例如,如果用户输入ab作为字符串,我使用类似Dir.glob("data/*/ab.txt")Dir.glob函数直接搜索ab.txt文件。但是,如果输入字符串包含特殊字符,则此方法不起作用。例如,如果输入字符串为**-B**,则Dir.glob("data/*/-b.txt")无法成功找到**-b.txt**文件。
所以我的问题是如何根据两个字符的字符串有效地选择文件,即使该字符串包含特殊字符?请注意,由于文件的数量很大,涉及将所有文件名读入内存的方法效率很低。我正在寻找一种方法,可以立即选择我感兴趣的文件,类似于当文件名不包括特殊字符时globbing的工作方式。

s5a0g9ez

s5a0g9ez1#

这就是Find擅长的:

require 'find'

files = []
pattern = '-b.txt'

Find.find('some/dir') do |path|
  next unless path.end_with? pattern
  files << path
end

运行该命令后,files将包含some/dir(或其子目录)中以-b.txt结尾的所有文件的文件路径。
我会避免使用regexs、基于shell的工具或globs,因为它们会特别使特殊字符难以使用。Find的好处是它以普通字符串的形式提供完整的文件路径,您可以将其与普通字符串进行比较,因此根本不涉及特殊的字符处理。

相关问题