在这个例子中:
第 5-11 行 - 请求用户提供搜索路径和搜索模式。 第 16 行 - 使用 Ruby 中 “Find” 类中的 “find” 方法遍历指定的搜索路径。 第 17 行 - 检查发现的文件是否为一个目录。如果是目录,并且不是 “.”,则递归地遍历该目录。 第 24 行 - 使用 “File” 类中的 “fnmatch” 方法检查发现的文件是否符合给定的模式。 第 25-34 行 - 如果文件符合模式,则打印文件的详细信息。下面是这个脚本的一个示例输出。
清单 2. 第一个例子的示例输出
[root@logan]# ruby findexample.rb -----------------------File Search----------------------------------- Enter the search path : /test Enter the search pattern : *.rb ---------------------------------------------------------------------- Searching in /test for files matching pattern *.rb ---------------------------------------------------------------------- Filename : s.rb Permissions : 100644 Owning uid : 1 Owning gid : 1 Size (bytes) : 57 --------------------------------------------------- Filename : test.rb Permissions : 100644 Owning uid : 0 Owning gid : 0 Size (bytes) : 996 --------------------------------------------------- Filename : s1.rb Permissions : 100644 Owning uid : 1 Owning gid : 1 Size (bytes) : 39 ---------------------------------------------------
在系统管理期间,最常见的一个需求是有效地使用 zip 文件来管理备份,或者将一组文件从一台计算机转移到另一台计算机。在这个方面,Ruby 很有优势。这里的第二个例子构建在第一个例子的基础上,但是包含了一个场景,在此场景中,需要将搜索到的文件打包到 zip 文件中。
内建的 zlib 模块可帮助处理 gzip 文件,对于大多数情况它都够好。但是,在这里我将使用另一个很好的 Ruby 库,即 “rubyzip”,来创建和处理 zip 归档文件。请查看 参考资料 小节,找到下载它的链接。而且要注意,这个例子使用纯 Ruby,它不依赖于计算机上当前提供的任何命令行实用程序。
安装 rubyzip
通过提供的链接下载 “rubyzip” gem,并将它复制到系统中。(在撰写本文之际,它的文件名是 “rubyzip-0.9.1.gem”)。
运行 gem 安装 rubyzip-0.9.1.gem
清单 3. 使用 zip 文件
require 'rubygems'
require_gem 'rubyzip'
require 'find'
require 'zip/zip'
puts ""
puts "------------------File Search and Zip-----------------------------"
puts ""
print "Enter the search path : "
searchpath = gets
searchpath = searchpath.chomp
puts ""
print "Enter the search pattern : "
pattern = gets
pattern = pattern.chomp
puts"----------------------------------------------------------------------"
puts "Searching in " + searchpath + " for files matching pattern " + pattern
puts"----------------------------------------------------------------------"
puts ""
puts"----------------------------------------------------------------------"
puts "Zipping up the found files..."
puts"----------------------------------------------------------------------"
Zip::ZipFile.open("test.zip", Zip::ZipFile::CREATE) {
|zipfile|
Find.find(searchpath) do |path|
if FileTest.directory?(path)
if File.basename(path)[0] == ?.
Find.prune # Don't look any further into this directory.
else
next
end
else
if File.fnmatch(pattern,File.basename(path))
p File.basename(path)
zipfile.add(File.basename(path),path)
end
end
end
}










