我每天有大约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
这可能是耗时的。我想知道我是否可以获得每次搜索的时间?是否有更少的时间消耗?
*编辑* 忘记提及文件名也不能用于缩短查找命令的结果。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
这实际上是一个过长的评论,但是:我发现的一件事是缓慢累积数千个文件的目录往往有内容,同样重要的inode,分散在整个磁盘上。 dpkg/info
让我在一年左右的积累后进行调查,并快速
cd current
find -print0 | sort -z | cpio -pdv0 ../new
mv ../current ../new
mv ../new ../current
倾向于分配inode编号并按顺序分配内容。 ls -il
要检查,如果你看到inode数字的混乱,那么这可能是值得的。成千上万寻求inode是没有什么可以打喷嚏的。
答案 3 :(得分: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个文本文件分类到一个文件夹
...可能不是您的文件系统的最佳用例。对于许多文件或每个目录的多个文件,它们中的一些比其他文件好几个数量级。考虑对不同的基准进行基准测试。