天天看點

Ruby和SHELL中如何周遊指定目錄的檔案

在工作中我們有在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,如需轉載請自行聯系原作者