在这个例子中:
第 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 }
|
|