掘井之路 2009-02-27
除了用作强大的 Web 应用程序开发平台外,通过与 Rails 框架相结合,Ruby 还具有较少被提及的另一面,那就是作为一种强大的脚本语言,就像 Python 或 Perl 那样。它拥有非常强大的功能,由于可以使用很多内建的和外部的库,因此可利用它的威力来解决通常系统管理工作环境中出现的很多脚本编写需求。而且,用 Ruby 编程也很有趣!
简介
Ruby 是一种功能极其丰富的、免费的、简单的、可扩展的、可移植的、面向对象的脚本编程语言。最近,它在 Web 领域广受欢迎。这在一定程度上要归因于非常强大的 Web 应用程序开发框架 Rails,Rails 正是用 Ruby 编写的。Rails,也称 Ruby on Rails(ROR),顾名思义,它为快速、有效地开发 Web 应用程序提供一个非常强大的平台。它是高度可伸缩的,Web 上有很多站点就是用 Ruby on Rails 构建的。
除了与 Rails 一起用作 Web 应用程序开发平台外,Ruby 还具有较少被提及的另一面,那就是作为一种强大的脚本编程语言,就像 Python 或 Perl 那样。它拥有非常强大的功能,由于可以使用很多内建的和外部的库,因此可利用它的威力来解决通常系统管理工作环境中出现的很多脚本编程需求。
系统管理需要大量编写脚本以使事情更简单、更有效。编写脚本比单调的手动工作能更好地解决用户管理、进程管理、文件管理、软件包管理和其他基本的自动化需求。在这个场景中,Ruby 非常有用。它有一套很好的库可满足这一点。
对于本文,我假设读者具有 Ruby 的应用知识。这里提供的基本例子使用纯 Ruby,因此可以在 Ruby 支持的任何类 UNIX? 系统以及 Windows? 上运行。对于更高级的 Cfruby 例子,需要能够使用一个 UNIX 系统。下面所有的例子已经在一台 Linux? 机器上使用 Ruby v1.8.4 进行了测试。它们应该也能用于最新版本的 Ruby。
实践中的 Ruby
第一个例子在指定路径中搜索符合给定模式的文件,并以用户友好的方式给出关于这些文件的详细信息。实现这一目标不必依赖于任何命令行实用程序,只需使用 Ruby 内建的 API。因此,这个例子在有 Ruby 运行的任何平台上都能运行。
而且,这个例子展示了 Ruby 在简化脚本编写需求方面有多强大。它不是简单地模拟 *nix "find" 命令,而是构建在该命令之上,因而在使用 Ruby 时具有很强的定制能力。
清单 1. 在给定路径中搜索符合给定模式的模式的文件,并显示它们的详细信息
require 'find'
puts ""
puts "-----------------------File Search-----------------------------------"
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 ""
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))
puts "Filename : " + File.basename(path)
s = sprintf("%o",File.stat(path).mode)
print "Permissions : "
puts s
print "Owning uid : "
puts File.stat(path).uid
print "Owning gid : "
puts File.stat(path).uid
print "Size (bytes) : "
puts File.stat(path).size
puts "---------------------------------------------------"
end
end
end
在这个例子中:
第 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,它不依赖于计算机上当前提供的任何命令行实用程序。