Walk a directory/Non-recursively: Difference between revisions

From Rosetta Code
Content added Content deleted
(→‎[[Perl]]: Nevermind. The perl code met the specs, the Java code doesn't)
(added Haskell)
Line 4: Line 4:


'''Note:''' Please be careful when running any code presented here.
'''Note:''' Please be careful when running any code presented here.

==[[Haskell]]==
[[Category:Haskell]]
'''Interpreter:''' [[GHC|GHCi]] 6.6

In this case, the pattern is a POSIX extended regular expression.
import System.Directory
import Text.Regex
walk :: FilePath -> String -> IO ()
walk dir pattern = do
filenames <- getDirectoryContents dir
putStr $ unlines $ filter ((/= Nothing).(matchRegex $ mkRegex pattern)) filenames
main = walk "." ".\\.hs$"


==[[Java]]==
==[[Java]]==

Revision as of 11:39, 26 January 2007

Task
Walk a directory/Non-recursively
You are encouraged to solve this task according to the task description, using any language you may know.

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

Note: Please be careful when running any code presented here.

Haskell

Interpreter: GHCi 6.6

In this case, the pattern is a POSIX extended regular expression.

import System.Directory
import Text.Regex

walk :: FilePath -> String -> IO ()
walk dir pattern = do
    filenames <- getDirectoryContents dir
    putStr $ unlines $ filter ((/= Nothing).(matchRegex $ mkRegex pattern)) filenames

main = walk "." ".\\.hs$"

Java

Compiler: javac, JDK 1.4 and up

Done using no pattern. But with end string comparison witch 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());
                    }
                }
            }
        }
    }
}


Perl

Interpreter: Perl

my @files = FindFiles('/home/user/music/', 'sql');
print "$_\n" for (@files);

sub FindFiles($ $){
  my $dir = shift;
  my $match = shift;

  opendir(DIR, $dir);
  my @files = grep(/$match/, readdir(DIR));
  closedir(DIR);

  return(@files);
}

PHP

Interpreter: PHP 5.2.0

$pattern = 'php';
$dh = opendir('c:/foo/bar'); // Or '/home/foo/bar' for Linux
while (false !== ($file = readdir($dh)))
{
    if ($file != '.' and $file != '..')
    {
        if (preg_match("/$pattern/", $file))
        {
            echo "$file matches $pattern\n";
        }
    }
}

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)

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$/)