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