提问人:Alex Nikolsky 提问时间:6/7/2023 最后编辑:Alex Nikolsky 更新时间:6/8/2023 访问量:79
在 Ruby 中与文件名中的特殊字符进行有效的文件匹配
Efficient file matching in Ruby with special characters in filenames
问:
我正在开发一个涉及大量文本文件(数百万个)的 Ruby 应用程序。这些文件中的每一个都称为双字符字符串,其中可以包含常规字母数字字符和特殊字符。以下是一些示例:
名为 ab.txt 的文件(无特殊字符)
名为 -b.txt 的文件(第一个字符是特殊字符)
名为 %! 的文件。txt(两个字符均为特殊字符)
我面临的任务是根据输入文本有效地选择这些文件的子集。当用户输入包含两个字符的字符串时,应用程序必须选择其名称与该字符串对应的所有目录中的所有文件。
我尝试使用带有 glob 的正则表达式模式来直接搜索感兴趣的文件。例如,如果用户输入 ab 作为字符串,我使用函数 like 直接搜索 ab.txt 文件。但是,如果输入字符串包含特殊字符,则此方法不起作用。例如,如果输入字符串为 -b,则无法成功找到 -b.txt 文件。Dir.glob
Dir.glob("data/*/ab.txt")
Dir.glob("data/*/-b.txt")
所以我的问题是:我怎样才能有效地根据两个字符的字符串选择文件,即使该字符串包含特殊字符?请注意,由于文件数量众多,涉及将所有文件名读取到内存中的方法效率低下。我正在寻找一种可以立即选择我感兴趣的文件的方法,类似于文件名不包含特殊字符时通配的工作方式。
答:
这就是 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
我会避免使用正则表达式、基于 shell 的工具或 glob,因为它们专门使特殊字符难以使用。好处是它为您提供了纯字符串的完整文件路径,您可以将其与纯字符串进行比较,因此根本不涉及特殊的字符处理。Find
评论
搜索词
是什么意思?你真的想使用正则表达式吗?