Walk a directory/Recursively

From Rosetta Code
Revision as of 15:59, 28 January 2007 by MikeMol (talk | contribs) (Created page. Moved Java, Python and Ruby code from "Walk Directory" to here.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Template:Tak

Walk a given directory tree and print files matching a given pattern.

Note: Please be careful when running any code examples found here.

Java

Compiler: javac, JDK 1.4 and up

Done using no pattern. But with end string comparison which gave better results.

import java.io.File;
public class MainEntry {
    public static void main(String[] args) {
        walkin(new File("/home/user")); //Replace this with a suitable directory
    }
    
    /**
     * Recursive function to descent into the directory tree and find all the file 
     * that end with ".mp3"
     * @param dir A file object defining the top directory
     **/
    public static void walkin(File dir) {
        String pattern = ".mp3";
        
        File listFile[] = dir.listFiles();
        if(listFile != null) {
            for(int i=0; i<listFile.length; i++) {
                if(listFile[i].isDirectory()) {
                    walkin(listFile[i]);
                } else {
                    if(listFile[i].getName().endsWith(pattern)) {
                        System.out.println(listFile[i].getPath());
                    }
                }
            }
        }
    }
}

Python

Interpreter: Python 2.5

 import fnmatch
 import os
 
 rootPath = '/'    # Change to a suitable path for your OS
 pattern = '*.mp3' # Any string; Can include any UNIX shell-style wildcards
                   # Includes: *, ?, [seq], [!seq]
 for root, directories, files in os.walk(rootPath):
     for aFile in files:
         if fnmatch.fnmatch(aFile, pattern):
             print os.path.join(root, aFile)


Interpreter: Python 2.5

Libraries: Path

 from path import path
 
 rootPath = '/'
 pattern = '*.mp3'
 
 d = path(rootPath)
 for f in d.walkfiles(pattern):
   print f

Ruby

Pattern matching using regular expressions

 #define a recursive function that will traverse the directory tree
 def printAndDescend(pattern)
   #we keep track of the directories, to be used in the second, recursive part of this function
   directories=[]
   Dir['*'].sort.each do |name|
     if File.file?(name) and name[pattern]
       puts(File.expand_path(name))
     elsif File.directory?(name)
       directories << name
     end
   end
   directories.each do |name|
     #don't descend into . or .. on linux
     Dir.chdir(name){printAndDescend(pattern)} if !Dir.pwd[File.expand_path(name)]
   end
 end
 #print all ruby files
 printAndDescend(/.+\.rb$/)

Or use the Find core Module

 require 'find'
 
 def find_and_print(path, pattern)
   Find.find(path) do |entry|
     if File.file?(entry) and entry[pattern]
       puts entry
     end
   end
 end
 
 # print all the ruby files
 find_and_print(".", /.+\.rb$/)