本文共 1140 字,大约阅读时间需要 3 分钟。
在工作中我们有在Ruby和SHELL中如何遍历指定目录的文件的需求,这个应该如何来实现呢?网上的方法也非常之多,我们可以拿来参考参考,如下边的traverse.rb文件内容所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/bin/ruby def traverse(path) if File.directory?(path) puts "Dirs:" + path Dir.foreach(path) do | file | if file != "." and file != ".." traverse(path + "/" + file ) end end else puts "Files:" + path end end traverse( "d:/vmware" ) |
其实ruby中已经定义了Find.find方法来处理这种情况,上面的ruby程序可以用其方法来实现,代码显得更为整洁,如下所示:
1 2 3 4 5 | #!/usr/bin/ruby require 'find' Find.find( "/usr/local/src" ) do |filename| p filename end |
我们还可以利用Find.find方法来输出ruby中可用的rb库,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/ruby require "find" def printrb $:. each do |dir| next if dir == "." next if dir == ".." Find.find(dir) do |f| if f =~ /\.rb$/i puts f end end end end printrb |
如果我们用shell脚本来实现类似需求,比如想遍历/usr/local/src目录里面包含的所有文件(包括子目录),那么应该如何实现呢?这里也会用到递归的思想,脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash function traverse(){ for file in ` ls $1` do if [ -d $1 "/" $ file ] then traverse $1 "/" $ file else echo $1 "/" $ file fi done } traverse "/usr/local/src" |