Walk a directory/Non-recursively: Difference between revisions
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
Walk a directory/Non-recursively
You are encouraged to solve this task according to the task description, using any language you may know.
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$/)