2

我每天将大约 50.000 个文本文件分类到一个文件夹中,例如:

/rootdir/20130831/ (containing 50000 files)
/rootdir/20130907/ (containing 50000 files)
/rootdir/20130908/ (containing 50000 files)
/rootdir/20130909/ (containing 50000 files)

现在我制作了一个将 find 和 grep 结合在一起的搜索脚本。find 命令是根据用户输入动态构建的。因此,如果用户只知道他想要搜索的年份。搜索将在所有 2013 文件夹中完成。

然后用户还输入一些搜索数据。这可以是最多 3 个搜索字符串,导致搜索如下:

find /rootdir/2013*/ -type f | xargs grep -l searchstring1 | xargs grep -l searchstring2 | xargs grep -l searchstring3

这当然会很耗时。我想知道我是否可以减少每次搜索的时间?有没有更省时的方法?

* 编辑 *忘了提到文件名也不能用来缩短 find 命令的结果。

4

4 回答 4

1

用一种解释器语言使用一个进程应该更快。这是Ruby的一个。

#!/usr/bin/env ruby

require 'find'

dir = ARGV.shift
year = ARGV.shift
patterns = ARGV.map{|a| Regexp.new(Regexp.quote(a)).freeze}

Dir.glob("#{dir}/#{year}**").each do |d|
  Find.find(d).drop(1).select{|f| File.file?(f)}.each do |f|
    text = File.read(f)
    match = true
    patterns.each do |p|
      unless p =~ text
        match = false
        break
      end
    end
    puts f if match
  end
end

示例用法:

ruby script.rb /rootdir 2013 searchstring1 searchstring2 searchstring3
于 2013-09-10T03:11:46.603 回答
0

我要做的第一件事是确保您首先搜索限制性最强的字符串。

如果“foo”在 10000 个文件中,“bar”在 100 个文件中,那么它会变慢

# Find 10000 matching files, then search for bar in them.
find .... | xargs grep -l foo | xargs grep -l bar

代替

# Find 100 matching files, then search for foo in them.
find .... | xargs grep -l bar | xargs grep -l foo
于 2013-09-09T15:09:29.727 回答
0

这确实是一个过长的评论,但是:我发现的一件事是缓慢积累数千个文件的目录往往具有内容,同样重要的是 inode,分散在磁盘上。 dpkg/info是在一年左右的积累后让我调查的那个,并且很快

cd current
find -print0 | sort -z | cpio -pdv0 ../new
mv ../current ../new
mv ../new ../current

倾向于分配 inode 编号并按顺序分配内容。 ls -il检查一下,如果你看到一堆 inode 编号,可能值得这样做。数以万计的对 inode 的搜索是不容小觑的。

于 2013-09-09T17:56:51.133 回答
0
find /rootdir/2013*/ -type f | xargs grep -l searchstring1 | xargs grep -l searchstring2 | xargs grep -l searchstring3

如果您这样做,可能会稍微快一些:

egrep -Rl 'searchstring1|searchstring2|searchstring3' /rootdir/2013*

另外,值得注意的是

我有大约 50.000 个文本文件分类到一个文件夹中

...可能不是您的文件系统的最佳用例。对于多文件或每个目录的多文件,它们中的一些比其他的要好很多数量级。考虑对不同的进行基准测试。

于 2013-09-09T18:06:19.857 回答