Walk a directory/Non-recursively: Difference between revisions

PascalABC.NET
(→‎{{header|Perl}}: also glob() function)
(PascalABC.NET)
 
(98 intermediate revisions by 62 users not shown)
Line 1:
{{task|File System Operations}}
Walk a given directory and print the ''names'' of files matching a given pattern.
 
;Task:
'''Note:''' This task is for non-recursive methods. These tasks should read a ''single directory'', not an entire directory tree. For code examples that read entire directory trees, see [[Walk Directory Tree]]
Walk a given directory and print the ''names'' of files matching a given pattern.
 
(How is "pattern" defined? substring match? DOS pattern? BASH pattern? ZSH pattern? Perl regular expression?)
 
 
'''Note:''' This task is for non-recursive methods.   These tasks should read a ''single directory'', not an entire directory tree.
 
'''Note:''' Please be careful when running any code presented here.
 
 
;Related task:
*   [[Walk Directory Tree]]   (read entire directory tree).
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">L(filename) fs:list_dir(‘/foo/bar’)
I filename.ends_with(‘.mp3’)
print(filename)</syntaxhighlight>
 
=={{header|68000 Assembly}}==
Non-recursive directory walk in Motorola 68000 assembly language under AmigaOs 2.04+ by Thorham. Uses regular Amiga dos pattern matching.
<syntaxhighlight lang="68000devpac">;
; Non-recursive directory walk for Motorola 68000 under AmigaOs 2.04+ by Thorham
;
 
execBase equ 4
 
;
; from exec includes
;
_LVOOpenLibrary equ -552
_LVOCloseLibrary equ -414
_LVOAllocVec equ -684
_LVOFreeVec equ -690
 
MEMF_ANY equ 0
 
;
; from dos includes
;
_LVOVPrintf equ -954
_LVOExamine equ -102
_LVOExNext equ -108
_LVOLock equ -84
_LVOUnLock equ -90
_LVOParsePatternNoCase equ -966
_LVOMatchPatternNoCase equ -972
 
ACCESS_READ equ -2
rsset 0
fib_DiskKey rs.l 1
fib_DirEntryType rs.l 1
fib_FileName rs.b 108
fib_Protection rs.l 1
fib_EntryType rs.l 1
fib_Size rs.l 1
fib_NumBlocks rs.l 1
fib_DateStamp rs.b 12
fib_Comment rs.b 80
fib_OwnerUID rs.w 1
fib_OwnerGID rs.w 1
fib_Reserved rs.b 32
fib_SIZEOF rs.b 0
 
;
; main
;
 
start
move.l execBase,a6
 
; open dos.library
 
lea dosName,a1
moveq #37,d0
jsr _LVOOpenLibrary(a6)
move.l d0,dosBase
beq exit
 
; allocate memory for file info block
 
move.l #fib_SIZEOF,d0
move.l #MEMF_ANY,d1
jsr _LVOAllocVec(a6)
move.l d0,fib
beq exit
 
; get directory lock
 
move.l dosBase,a6
 
move.l #pathString,d1
move.l #ACCESS_READ,d2
jsr _LVOLock(a6)
move.l d0,lock
beq exit
 
; examine directory for ExNext
 
move.l lock,d1
move.l fib,d2
jsr _LVOExamine(a6)
tst.w d0
beq exit
 
; parse pattern string
 
move.l #patternString,d1
move.l #patternParsed,d2
move.l #sizeof_patternString*2+2,d3
jsr _LVOParsePatternNoCase(a6)
tst.l d0
blt exit
 
; get some pointers for use in the loop
 
lea printfArgs,a2
move.l fib,a3
lea fib_FileName(a3),a3
 
.loop
 
; get next directory entry
 
move.l lock,d1
move.l fib,d2
jsr _LVOExNext(a6)
tst.w d0
beq exit
 
; match pattern
 
move.l #patternParsed,d1
move.l a3,d2
jsr _LVOMatchPatternNoCase(a6)
 
; if match then print file name
 
tst.l d0
beq .nomatch
 
move.l a3,(a2)
move.l #formatString,d1
move.l #printfArgs,d2
jsr _LVOVPrintf(a6)
 
.nomatch
bra .loop
 
; cleanup and exit
 
exit
move.l dosBase,a6
move.l lock,d1
jsr _LVOUnLock(a6)
 
move.l execBase,a6
move.l fib,a1
tst.l a1
beq .l1
jsr _LVOFreeVec(a6)
.l1
move.l dosBase,a1
jsr _LVOCloseLibrary(a6)
rts
 
section data,data_p
;
; variables
;
dosBase
dc.l 0
 
lock
dc.l 0
 
fib
dc.l 0
 
printfArgs
dc.l 0
;
; strings
;
dosName
dc.b "dos.library",0
 
pathString
dc.b "ram:",0
 
formatString
dc.b "%s",10,0
 
patternString
dc.b "#?",0
patternString_end
sizeof_patternString=patternString_end-patternString
 
patternParsed
dcb.b sizeof_patternString*2+2</syntaxhighlight>
 
=={{header|8080 Assembly}}==
 
This program runs under CP/M, which was the commonly used OS on 8080 (and Z80)-based
machines. The pattern used is the CP/M file pattern, which is the same as a DOS pattern:
the filename, the extension, and an optional drive letter.
 
<syntaxhighlight lang="text">exit: equ 0 ; CP/M syscall to exit
puts: equ 9 ; CP/M syscall to print a string
sfirst: equ 17 ; 'Find First' CP/M syscall
snext: equ 18 ; 'Find Next' CP/M syscall
FCB: equ 5Ch ; Location of FCB for file given on command line
org 100h
lxi d,FCB ; CP/M parses the command line for us automatically
mvi c,sfirst; and prepares an FCB which we can pass to SFIRST
call 5 ; immediately.
lxi d,emsg ; If SFIRST returns an error, there is no file,
mvi c,puts ; so we should print an error message.
loop: inr a ; A=FF = error
jz 5
dcr a ; If we _do_ have a file, the directory entry
rrc ; is located at DTA (80h) + A * 32. 0<=A<=3.
rrc ; Rotate right twice, moving low bits into high bits,
stc ; then finally rotate a 1 bit into the top bit.
rar ; The effect is 000000AB -> 1AB00000.
inr a ; Finally the filename is at offset 1 in the dirent.
mvi h,0 ; Set HL = pointer to the filename
mov l,a
lxi d,fname ; The filename is stored as 'FILENAMEEXT', but let's
mvi b,8 ; be nice and print 'FILENAME.EXT\r\n'.
call memcpy ; Copy filename (wihtout extension) into placeholder
inx d ; Skip the '.' in the placeholder
mvi b,3 ; Then copy the extension
call memcpy
lxi d,fname ; Then print the formatted filename
mvi c,puts
call 5
lxi d,FCB ; Find the next file matching the pattern in the FCB
mvi c,snext ; The result is the same as for SFIRST, so we can
call 5 ; loop back here, except FF means no more files.
mvi c,exit ; Arrange for the error routine to instead exit cleanly
jmp loop
memcpy: mov a,m ; Copy B bytes from HL to DE
stax d
inx h
inx d
dcr b
jnz memcpy
ret
emsg: db 'Not Found$'
fname: db 'XXXXXXXX.XXX',13,10,'$' ; Filename placeholder</syntaxhighlight>
 
{{out}}
 
<pre style='height: 50ex;'>I>dir
I: TINST COM : TINST DTA : TINST MSG : TURBO COM
I: TURBO MSG : TURBO OVR : WALKDIR ASM : WALKDIR PRN
I: WALKDIR HEX : WALKDIR COM
I>walkdir walkdir.*
WALKDIR .ASM
WALKDIR .PRN
WALKDIR .HEX
WALKDIR .COM
 
I>walkdir *.com
TINST .COM
TURBO .COM
WALKDIR .COM
 
I>walkdir foobar.baz
Not Found
I>dir a:*.asm
A: COUNT ASM : DETECT ASM : SUBLEQ ASM : LUHN ASM
I>walkdir a:*.asm
COUNT .ASM
DETECT .ASM
SUBLEQ .ASM
LUHN .ASM
</pre>
 
=={{header|8th}}==
<syntaxhighlight lang="forth">
"*.c" f:glob \ puts an array of strings with the file names on the top of the stack
</syntaxhighlight>
 
=={{header|Action!}}==
The attached result has been obtained under DOS 2.5.
<syntaxhighlight lang="action!">PROC GetFileName(CHAR ARRAY line,fname)
BYTE i,len
 
len=0
i=3
FOR i=3 TO 10
DO
IF line(i)=32 THEN EXIT FI
len==+1
fname(len)=line(i)
OD
len==+1
fname(len)='.
FOR i=11 TO 13
DO
IF line(i)=32 THEN EXIT FI
len==+1
fname(len)=line(i)
OD
fname(0)=len
RETURN
 
PROC Dir(CHAR ARRAY filter)
CHAR ARRAY line(255),fname(255)
BYTE dev=[1]
 
PrintE(filter)
Close(dev)
Open(dev,filter,6)
DO
InputSD(dev,line)
IF line(0)=0 OR line(0)>0 AND line(1)#32 THEN
EXIT
FI
GetFileName(line,fname)
Put(32) PrintE(fname)
OD
Close(dev)
PutE()
RETURN
 
PROC Main()
Dir("D:*.*")
Dir("H1:X*.*")
Dir("H1:?????.ACT")
Dir("H1:??F*.*")
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Walk_a_directory_non-recursively.png Screenshot from Atari 8-bit computer]
<pre>
D:*.*
DOS.SYS
DUP.SYS
INPUT.TXT
 
H1:X*.*
XIAOL_24.ACT
XML_O_CU.ACT
 
H1:?????.ACT
AB_3D.ACT
BREAK.ACT
CUSIP.ACT
SIEVE.ACT
SLEEP.ACT
WHILE.ACT
 
H1:??F*.*
HOFST_34.ACT
INFINITE.ACT
UTF8__P2.ACT
</pre>
 
=={{header|Ada}}==
{{works with|GCC|4.12}}
<langsyntaxhighlight lang="ada">with Ada.Directories; use Ada.Directories;
with Ada.Text_IO; use Ada.Text_IO;
 
Line 26 ⟶ 384:
 
End_Search (Search);
end Walk_Directory;</langsyntaxhighlight>
 
=={{header|ALGOL 68}}==
Line 32 ⟶ 390:
{{works with|ALGOL 68G|Any - tested with release mk15-0.8b.fc9.i386 - uses non-standard library routines ''get directory'' and'' grep in string''.}}
<!-- {{does not work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386 - ''get directory'' and'' grep in string'' not available in any library ... yet}} -->
<langsyntaxhighlight lang="algol68">INT match=0, no match=1, out of memory error=2, other error=3;
 
[]STRING directory = get directory(".");
Line 40 ⟶ 398:
print((file, new line))
FI
OD</langsyntaxhighlight>
{{out|Sample output}}
<pre>
Line 56 ⟶ 414:
AppleScript itself has limited built-in file system access. Typically, the Mac OS Finder is used to gather such information.
To list all file/folders in the root directory:
<langsyntaxhighlight AppleScriptlang="applescript">tell application "Finder" to return name of every item in (startup disk)
--> EXAMPLE RESULT: {"Applications", "Developer", "Library", "System", "Users"}</langsyntaxhighlight>
To list all pdf files in user's home directory:
<langsyntaxhighlight AppleScriptlang="applescript">tell application "Finder" to return name of every item in (path to documents folder from user domain) whose name ends with "pdf"
--> EXAMPLE RESULT: {"About Stacks.pdf", "Test.pdf"}</langsyntaxhighlight>
The key clause is the <code>whose</code> modifier keyword. The Finder can interpret many variations, including such terms as <code>whose name begins with</code>, <code>whose name contains</code>, etc. As well as boolean combinations:
<langsyntaxhighlight AppleScriptlang="applescript">tell application "Finder" to return name of every item in (path to documents folder from user domain) whose name does not contain "about" and name ends with "pdf"
--> RETURNS: {"Test.pdf"}</langsyntaxhighlight>
The Finder also supports the <code>entire contents</code> modifier keyword, which effectively performs a recursive directory scan without recursion.
<langsyntaxhighlight AppleScriptlang="applescript">tell application "Finder" to return name of every item in entire contents of (path to documents folder from user domain) whose name ends with "pdf"</langsyntaxhighlight>
----
Nowadays, it's more usual to use macOS's System Events application for this kind of task as it's very much faster than the Finder, especially with 'whose' filters. However, its results, unlike the Finder's, aren't sorted by the items' names and it includes results for hidden items too if these match the criteria.
 
<syntaxhighlight lang="applescript">tell application "System Events" to return name of every item in documents folder whose name extension is "pdf"
--> EXAMPLE RESULT: {"ShellScripting.pdf", "RFC 4180 (CSV spec).pdf", "About Stacks.pdf", "AppleScriptLanguageGuide.pdf", "robinson_jeffers_2004_9.pdf", "DiskWarrior Manual.pdf", "RFC 2445 (iCalendar spec).pdf", "Artistic Orchestration.pdf"}</syntaxhighlight>
 
Intermediate in speed between the Finder and System Events are shell scripts, which are handy if you're more comfortable with shell scripts than with AppleScript.
 
<syntaxhighlight lang="applescript">set docsFolderPath to POSIX path of (path to documents folder)
-- By default, "ls" returns file names sorted by character code, so save the sorting until the end and do it case-insensitively.
set shellCommandText to "ls -f " & quoted form of docsFolderPath & " | grep -i '\\.pdf$' | sort -f"
return paragraphs of (do shell script shellCommandText)
--> EXAMPLE RESULT: {"About Stacks.pdf", "AppleScriptLanguageGuide.pdf", "Artistic Orchestration.pdf", "DiskWarrior Manual.pdf", "RFC 2445 (iCalendar spec).pdf", "RFC 4180 (CSV spec).pdf", "robinson_jeffers_2004_9.pdf", "ShellScripting.pdf"}</syntaxhighlight>
 
Best of all for speed and sorting, although requiring somewhat more code, are the Foundation methods available through AppleScriptObjC.
 
<syntaxhighlight lang="applescript">use AppleScript version "2.4" -- OS X 10.10 (Yosemite) or later
use framework "Foundation"
use scripting additions
 
set docsFolderURL to current application's class "NSURL"'s fileURLWithPath:(POSIX path of (path to documents folder))
-- Get NSURLs for the folder's visible contents.
tell current application's class "NSFileManager"'s defaultManager() to ¬
set visibleItems to its contentsOfDirectoryAtURL:(docsFolderURL) includingPropertiesForKeys:({}) ¬
options:(current application's NSDirectoryEnumerationSkipsHiddenFiles) |error|:(missing value)
-- Filter case-insensitively for those whose names have ".pdf" extensions.
set filter to current application's class "NSPredicate"'s predicateWithFormat:("pathExtension ==[c] 'pdf'")
set PDFs to visibleItems's filteredArrayUsingPredicate:(filter)
-- Get the names of any matching items.
set pdfNames to PDFs's valueForKey:("lastPathComponent")
-- Sort these case-insensitively and considering numerics.
set pdfNames to pdfNames's sortedArrayUsingSelector:("localizedStandardCompare:")
-- Return the result as an AppleScript list of text.
return pdfNames as list
--> EXAMPLE RESULT: {"About Stacks.pdf", "AppleScriptLanguageGuide.pdf", "Artistic Orchestration.pdf", "DiskWarrior Manual.pdf", "RFC 2445 (iCalendar spec).pdf", "RFC 4180 (CSV spec).pdf", "robinson_jeffers_2004_9.pdf", "ShellScripting.pdf"}</syntaxhighlight>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">; list all files at current path
print list "."
 
; get all files at given path
; and select only the ones we want
 
; just select the files with .md extension
select list "some/path"
=> [".md" = extract.extension]
 
; just select the files that contain "test"
select list "some/path"
=> [in? "test"]</syntaxhighlight>
 
=={{header|AutoHotkey}}==
Display all INI files in Windows directory.
<langsyntaxhighlight lang="autohotkey">Loop, %A_WinDir%\*.ini
out .= A_LoopFileName "`n"
MsgBox,% out</langsyntaxhighlight>
 
=={{header|BaCon}}==
This code will print all files in the current directory ".", separated by a newline symbol:
<syntaxhighlight lang="qbasic">PRINT WALK$(".", 1, ".+", FALSE, NL$)</syntaxhighlight>
 
=={{header|BASIC}}==
Line 77 ⟶ 490:
 
DOS wildcards are rather underpowered when compared to... well... anything else.
{{works with|FreeBASIC}}
 
<langsyntaxhighlight lang="qbasic">DECLARE SUB show (pattern AS STRING)
 
show "*.*"
Line 89 ⟶ 502:
f = DIR$
LOOP
END SUB</langsyntaxhighlight>
 
=={{header|BASIC256}}==
<syntaxhighlight lang="basic256">call show ("c:\")
end
 
subroutine show (pattern$)
f$ = dir(pattern$)
while length(f$)
print f$
f$ = dir
end while
end subroutine</syntaxhighlight>
 
=={{header|Batch File}}==
A simple command that displays all EXE files in System32 directory non-recursively.
<syntaxhighlight lang="dos">dir /b "%windir%\system32\*.exe"</syntaxhighlight>
The same command inside FOR loop:
*Inside a Batch File:
<syntaxhighlight lang="dos">@for /F "tokens=*" %%F in ('dir /b "%windir%\system32\*.exe"') do echo %%F</syntaxhighlight>
*Command-line:
<syntaxhighlight lang="dos">for /F "tokens=*" %F in ('dir /b "%windir%\system32\*.exe"') do echo %F</syntaxhighlight>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> directory$ = "C:\Windows\"
pattern$ = "*.ini"
PROClistdir(directory$ + pattern$)
Line 109 ⟶ 543:
SYS "FindClose", sh%
ENDIF
ENDPROC</langsyntaxhighlight>
 
=={{header|C}}==
Line 115 ⟶ 549:
{{works with|POSIX|.1-2001}}
In this example, the pattern is a [[POSIX]] extended regular expression.
<langsyntaxhighlight lang="c">#include <sys/types.h>
#include <dirent.h>
#include <regex.h>
Line 148 ⟶ 582:
walker(".", ".\\.c$");
return 0;
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
<syntaxhighlight lang="csharp">using System;
using System.IO;
 
namespace DirectoryWalk
{
class Program
{
static void Main(string[] args)
{
string[] filePaths = Directory.GetFiles(@"c:\MyDir", "a*");
foreach (string filename in filePaths)
Console.WriteLine(filename);
}
}
}
</syntaxhighlight>
 
=={{header|C++}}==
{{libheader|boost|1.50.0}}
<langsyntaxhighlight lang="cpp">#include "boost/filesystem.hpp"
#include "boost/regex.hpp"
#include <iostream>
Line 174 ⟶ 626:
}
}
}</langsyntaxhighlight>
 
=={{headerlibheader|C sharpstd|C#++17}}==
<syntaxhighlight lang="cpp">
<lang csharp>using System;
#include <filesystem>
using System.IO;
#include <iostream>
 
namespace DirectoryWalkfs = std::filesystem;
 
{
int main() {
class Program
fs::path current_dir(".");
{
// list all files containing an mp3 extension
static void Main(string[] args)
for (auto &file : fs::directory_iterator(current_dir)) {
{
if (file.path().extension() == ".mp3")
string[] filePaths = Directory.GetFiles(@"c:\MyDir", "a*");
std::cout << foreach file.path().filename().string() filename<< in filePaths)std::endl;
}
Console.WriteLine(filename);
}</syntaxhighlight>
}
 
}
=={{header|Clojure}}==
}
Using Java 8's [https://docs.oracle.com/javase/8/docs/api/java/nio/file/FileSystem.html#getPathMatcher-java.lang.String- PathMatcher] patterns.
</lang>
 
<syntaxhighlight lang="clojure">(import java.nio.file.FileSystems)
 
(defn match-files [f pattern]
(.matches (.getPathMatcher (FileSystems/getDefault) (str "glob:*" pattern)) (.toPath f)))
 
(defn walk-directory [dir pattern]
(let [directory (clojure.java.io/file dir)]
(map #(.getPath %) (filter #(match-files % pattern) (.listFiles directory)))))
</syntaxhighlight>
 
=={{header|ColdFusion}}==
This example display all files and directories directly under '''C:\temp''' that end with ''.html''
<langsyntaxhighlight lang="cfm"><cfdirectory action="list" directory="C:\temp" filter="*.html" name="dirListing">
<cfoutput query="dirListing">
#dirListing.name# (#dirListing.type#)<br>
</cfoutput></langsyntaxhighlight>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun walk-directory (directory pattern)
(directory (merge-pathnames pattern directory)))</langsyntaxhighlight>
Uses the filename pattern syntax provided by the CL implementation.
 
=={{header|D}}==
<syntaxhighlight lang="d">void main() {
See also the D code at [[Walk Directory Tree]].
<lang d> import std.stdio, std.file;
import std.file;
import std.path;
 
dirEntries(".", "*.*", SpanMode.shallow).writeln;
void main(string[] args) {
}</syntaxhighlight>
auto path = args.length > 1 ? args[1] : "." ; // default current
auto pattern = args.length > 2 ? args[2] : "*.*"; // default all file
bool matchNPrint(DirEntry* de){
if(!de.isdir && fnmatch(de.name, pattern))
writefln(de.name) ;
return true ; // continue
}
 
=={{header|DCL}}==
listdir(path, &matchNPrint) ;
<pre>* matches any number of characters
}</lang>
& matches exactly any one character</pre>
<syntaxhighlight lang="text">$ loop:
$ f = f$search( p1 )
$ if f .eqs. "" then $ exit
$ write sys$output f
$ goto loop</syntaxhighlight>
{{out}}
<pre>$ @walk_a_directory *.*
USERS:[DAVID]A.A;1
USERS:[DAVID]B.B;1
USERS:[DAVID]GG.GG;1
USERS:[DAVID]WALK_A_DIRECTORY.COM;1
$ @walk_a_directory *.%
USERS:[DAVID]A.A;1
USERS:[DAVID]B.B;1
$ @walk_a_directory *a*.*
USERS:[DAVID]A.A;1
USERS:[DAVID]WALK_A_DIRECTORY.COM;1
$ </pre>
=={{header|Delphi}}==
 
=== Hand-coded ===
See: [[Pascal]]
 
=== Using System.IOUtils ===
 
{{libheader| System.IOUtils}}
<syntaxhighlight lang="delphi">
program Walk_a_directory;
 
{$APPTYPE CONSOLE}
{$R *.res}
 
uses
System.IOUtils;
 
var
Files: TArray<string>;
FileName, Directory: string;
 
begin
Directory := TDirectory.GetCurrentDirectory; // dir = '.', work to
Files := TDirectory.GetFiles(Directory, '*.*');
 
for FileName in Files do
begin
Writeln(FileName);
end;
 
Readln;
end.
 
</syntaxhighlight>
 
{{out}}
<pre>
D:\Rosettacode\Walk_a_directory\Win32\Debug\Walk_a_directory.exe
</pre>
 
=={{header|E}}==
<langsyntaxhighlight lang="e">def walkDirectory(directory, pattern) {
for name => file ? (name =~ rx`.*$pattern.*`) in directory {
println(name)
}
}</langsyntaxhighlight>
Example:
<langsyntaxhighlight lang="e">? walkDirectory(<file:~>, "bash_")
.bash_history
.bash_profile
.bash_profile~</langsyntaxhighlight>
 
=={{header|Elena}}==
ELENA 6.x:
<syntaxhighlight lang="elena">import system'io;
import system'routines;
import extensions'routines;
public program()
{
var dir := Directory.assign("c:\MyDir");
dir.getFiles("a.*").forEach(printingLn);
}</syntaxhighlight>
 
=={{header|Elixir}}==
<syntaxhighlight lang="elixir"># current directory
IO.inspect File.ls!
 
dir = "/users/public"
IO.inspect File.ls!(dir)</syntaxhighlight>
 
{{out}}
<pre>
["check.exs", "e.bat", "foo", "input.txt", "test.beam", "test.exs", "test.txt"]
["Desktop", "desktop.ini", "Documents", "Downloads", "Favorites", "Libraries",
"Music", "Pictures", "Recorded TV", "Videos"]
</pre>
 
=={{header|Emacs Lisp}}==
Line 241 ⟶ 780:
directory, optionally restricted to those matching a regexp.
 
<langsyntaxhighlight lang="lisp">(directory-files "/some/dir/name"
nil ;; just the filenames, not full paths
"\\.c\\'" ;; regexp
t) ;; don't sort the filenames
;;=> ("foo.c" "bar.c" ...)</syntaxhighlight>
=>
 
("foo.c" "bar.c" ...)</lang>
=={{header|Erlang}}==
Use builtin function filelib:fold_files/5
 
{{out}}
<pre>
8> filelib:fold_files( "/tmp", ".*", false, fun(File, Acc) -> [File|Acc] end, []).
["/tmp/.X0-lock","/tmp/.cron-check-4000-was-here",
"/tmp/kerneloops.XyN0SP","/tmp/npicagwD7tf"]
9> filelib:fold_files( "/tmp", "k.*P", false, fun(File, Acc) -> [File|Acc] end, []).
["/tmp/kerneloops.XyN0SP"]
</pre>
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">include file.e
 
procedure show(sequence pattern)
Line 260 ⟶ 810:
end procedure
 
show("*.*")</langsyntaxhighlight>
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">System.IO.Directory.GetFiles("c:\\temp", "*.xml")
|> Array.iter (printfn "%s")</langsyntaxhighlight>
 
=={{header|Factor}}==
Using unix globs. Also see the "directory." in basis/tools/files.factor.
<langsyntaxhighlight lang="factor">USING: globs io io.directories kernel regexp sequences ;
IN: walk-directory-non-recursively
 
: print-files ( path pattern -- )
[ directory-files ] [ <glob> ] bi* [ matches? ] curry filter
[ print ] each ;</langsyntaxhighlight>
Ex:
( scratchpad ) "." "*.txt" print-files
Line 281 ⟶ 831:
{{works with|gforth|0.6.2}}
Gforth's directory walking functions are tied to the POSIX ''dirent'' functions, used by the C langauge entry above. Forth doesn't have regex support, so a simple filter function is used instead.
<langsyntaxhighlight lang="forth">defer ls-filter ( name len -- ? )
: ls-all 2drop true ;
: ls-visible drop c@ [char] . <> ;
Line 305 ⟶ 855:
' c-file? is ls-filter
 
s" ." ls</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
{{trans|BASIC}}
<syntaxhighlight lang="freebasic">
Sub show (pattern As String)
Dim As String f = Dir$(pattern)
While Len(f)
Print f
f = Dir$
Wend
End Sub
 
show "*.*"
Sleep
</syntaxhighlight>
 
=={{header|Frink}}==
This prints the names of all of the files in the current directory that end with <CODE>.frink</CODE> using a regular expression.
 
<syntaxhighlight lang="frink">for f = select[files["."], {|f1| f1.getName[] =~ %r/\.frink$/}]
println[f.getName[]]</syntaxhighlight>
 
{{out}}
<pre>UTMtest.frink
mersennetest.frink
piChudnovskyNew.frink
showFonts.frink
graphicalSieve.frink
...
</pre>
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">
include "NSLog.incl"
 
void local fn EnumerateDirectoryAtURL( dirURL as CFURLRef )
NSDirectoryEnumerationOptions options = NSDirectoryEnumerationSkipsPackageDescendants + ¬
NSDirectoryEnumerationSkipsHiddenFiles + ¬
NSDirectoryEnumerationSkipsSubdirectoryDescendants
DirectoryEnumeratorRef enumerator = fn FileManagerEnumeratorAtURL( dirURL, NULL, options, NULL, NULL )
CFURLRef url = fn EnumeratorNextObject( enumerator )
while ( url )
if ( fn StringIsEqual( fn URLPathExtension( url ), @"fb" ) )
NSLog(@"%@",fn URLLastPathComponent( url ))
end if
url = fn EnumeratorNextObject( enumerator )
wend
end fn
 
fn EnumerateDirectoryAtURL( fn FileManagerURLForDirectory( NSDesktopDirectory, NSUserDomainMask ) )
 
HandleEvents
</syntaxhighlight>
 
{{out}}
<pre>
ListFormatter.fb
ObjectProperty1.fb
Archimedean Spiral with Bezier Curve.fb
FB3D.fb
lenArray.fb
Rosettacode Random Noise v04.fb
AssociatedObject.fb
</pre>
 
=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=c5fde952fecd1d7052101b1e2287f2ff Click this link to run this code]'''
<syntaxhighlight lang="gambas">Public Sub Main()
Dim sTemp As String
For Each sTemp In Dir("/etc", "*.d")
Print sTemp
Next
 
End</syntaxhighlight>
Output:
<pre>
profile.d
rc1.d
rc4.d
rcS.d
binfmt.d
init.d
rc5.d
rc2.d
</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 317 ⟶ 954:
func main() {
fmt.Println(filepath.Glob("*.go"))
}</langsyntaxhighlight>
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy">// *** print *.txt files in current directory
new File('.').eachFileMatch(~/.*\.txt/) {
println it
Line 328 ⟶ 965:
new File('/foo/bar').eachFileMatch(~/.*\.txt/) {
println it
}</langsyntaxhighlight>
 
=={{header|Hare}}==
<syntaxhighlight lang="hare">use fmt;
use glob;
 
export fn main() void = {
ls("/etc/*.conf");
};
 
fn ls(pattern: str) void = {
let gen = glob::glob(pattern, glob::flags::NONE);
defer glob::finish(&gen);
for (true) match (glob::next(&gen)) {
case void =>
break;
case glob::failure =>
continue;
case let s: str =>
fmt::printfln("{}", s)!;
};
};</syntaxhighlight>
 
=={{header|Haskell}}==
{{works with|GHC|GHCi|6.6}}
In this example, the pattern is a POSIX extended regular expression.
<langsyntaxhighlight lang="haskell">import System.Directory
import Text.Regex
import Data.Maybe
Line 342 ⟶ 1,000:
mapM_ putStrLn $ filter (isJust.(matchRegex $ mkRegex pattern)) filenames
 
main = walk "." ".\\.hs$"</langsyntaxhighlight>
 
=={{header|HicEst}}==
More on [http://www.HicEst.com/SYSTEM.htm SYSTEM], [http://www.HicEst.com/OPEN.htm OPEN], [http://www.HicEst.com/indexfnc.htm INDEX]
<langsyntaxhighlight lang="hicest">CHARACTER dirtxt='dir.txt', filename*80
 
SYSTEM(DIR='*.*', FIle=dirtxt) ! "file names", length, attrib, Created, LastWrite, LastAccess
Line 355 ⟶ 1,013:
! write file names with extensions "txt", or "hic", or "jpg" (case insensitive) using RegEx option =128:
IF( INDEX(filename, "\.txt|\.hic|\.jpg", 128) ) WRITE() filename
ENDDO</langsyntaxhighlight>
 
=={{header|IDL}}==
<lang idl>f = file_search('*.txt', count=cc)
if cc gt 0 then print,f</lang>
(IDL is an array language - very few things are ever done in 'loops'.)
 
=={{header|Icon}} and {{header|Unicon}}==
This uses Unicon extensions for ''stat'' and to read directories. Icon can uses ''system'' to accomplish the same objective.
<langsyntaxhighlight Iconlang="icon">procedure main()
every write(getdirs(".","icn")) # writes out all directories from the current directory down
end
Line 377 ⟶ 1,030:
close(d)
}
end</langsyntaxhighlight>
 
=={{header|IDL}}==
<syntaxhighlight lang="idl">f = file_search('*.txt', count=cc)
if cc gt 0 then print,f</syntaxhighlight>
(IDL is an array language - very few things are ever done in 'loops'.)
 
=={{header|J}}==
<langsyntaxhighlight lang="j">require 'dir'
0 dir '*.png'
0 dir '/mydir/*.txt'</langsyntaxhighlight>
The verb <tt>dir</tt> supports a number of reporting options determined by its left argument. A left argument of <tt>0</tt> reports just the file names.
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">File dir = new File("/foo/bar");
 
String[] contents = dir.list();
for (String file : contents)
if (file.endsWith(".mp3"))
System.out.println(file);</langsyntaxhighlight>
 
=={{header|JavaScript}}==
{{works with|JScript}}
<langsyntaxhighlight lang="javascript">var fso = new ActiveXObject("Scripting.FileSystemObject");
var dir = fso.GetFolder('test_folder');
 
Line 416 ⟶ 1,074:
}
 
walkDirectory(dir, '\\.txt$');</langsyntaxhighlight>
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
 
<syntaxhighlight lang="julia">for filename in readdir("/foo/bar")
if endswith(filename, ".mp3")
print(filename)
end
end</syntaxhighlight>
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">// version 1.1.2
 
import java.io.File
 
fun walkDirectory(dirPath: String, pattern: Regex): List<String> {
val d = File(dirPath)
require(d.exists() && d.isDirectory())
return d.list().filter { it.matches(pattern) }
}
 
fun main(args: Array<String>) {
val r = Regex("""^a.*\.h$""") // get all C header files beginning with 'a'
val files = walkDirectory("/usr/include", r)
for (file in files) println(file)
}</syntaxhighlight>
Sample output (Ubuntu v14.04):
{{out}}
<pre>
argp.h
alloca.h
ar.h
aliases.h
autosprintf.h
aio.h
assert.h
argz.h
</pre>
 
=={{header|Lasso}}==
<syntaxhighlight lang="lasso">local(matchingfilenames = array)
 
dir('.') -> foreach => {#1 >> 'string' ? #matchingfilenames -> insert(#1)}
 
#matchingfilenames</syntaxhighlight>
-> array(mystrings.html, a_string_file.txt)
 
=={{header|Lingo}}==
<syntaxhighlight lang="lingo">-- Usage: printFiles("C:\scripts", ".ls")
on printFiles (dir, fileType)
i = 1
sub = fileType.length -1
repeat while TRUE
fn = getNthFileNameInFolder(dir, i)
if fn = EMPTY then exit repeat
i = i+1
if fn.length<fileType.length then next repeat
if fn.char[fn.length-sub..fn.length]=fileType then put fn
end repeat
end</syntaxhighlight>
 
=={{header|LiveCode}}==
<syntaxhighlight lang="livecode">set the defaultFolder to the documents folder -- the documents folder is a "specialFolderPath"
put the files into docfiles
filter docfiles with "*.txt"
put docfiles</syntaxhighlight>
 
=={{header|Lua}}==
Lua itself is extremely spartanic as it is meant for embedding. Reading out a directory is not something that a minimal standard C library can do, and so minimal Lua without native extension libraries can't do it either. But lfs (LuaFileSystem) is about as standard an extension as it gets, so we use that.
<langsyntaxhighlight Lualang="lua">require "lfs"
directorypath = "." -- current working directory
for filename in lfs.dir(directorypath) do
Line 426 ⟶ 1,150:
print(filename)
end
end</langsyntaxhighlight>
Although Lua is spartanic, it still provides functions such as os.execute([command]) and io.popen(prog [, mode]). Below an example for Windows users having io.popen at their disposal. Mind you, it may pop-up a command window.
<syntaxhighlight lang="lua">-- Gets the output of given program as string
-- Note that io.popen is not available on all platforms
local function getOutput(prog)
local file = assert(io.popen(prog, "r"))
local output = assert(file:read("*a"))
file:close()
return output
end
 
-- Iterates files in given directory
local function files(directory, recursively)
-- Use windows" dir command
local directory = directory:gsub("/", "\\")
local filenames = getOutput(string.format("dir %s %s/B/A:A", directory, recursively and '/S' or ''))
-- Function to be called in "for filename in files(directory)"
return coroutine.wrap(function()
for filename in filenames:gmatch("([^\r\n]+)") do
coroutine.yield(filename)
end
end)
end
 
-- Walk "C:/Windows" looking for executables
local directory = "C:/Windows"
local pattern = ".*%.exe$" -- for finding executables
for filename in files(directory) do
if filename:match(pattern) then
print(filename)
end
end</syntaxhighlight>
 
=={{header|M2000 Interpreter}}==
Console has a popup list called Menu, which we can fill using Files statements. Files statement get some symbols before first argument for sorting and to not export to console but to menu list. So we can use MenuItems to find how many items return, and we can walk menu array to get the names (from 1 to MenuItems).
 
Files statement get as first argument a pattern or a list of file extensions "txt|bmp" return these two kind of files.
There is a second optional parameter which examine all files founded from first filter for included letters. We can add using | as seperator, a list of strings included in same line. Files examine all files, opened one by one, using an automatic way to find what kind of text file is, an Ansi, a Utf8, a Utf-16LE, or a Utf-16BE. Also automatic find the line breaks. All files converted at open as utf-16LE and then searched. For Ansi files, Locale used to make the right conversion.
<syntaxhighlight lang="m2000 interpreter">
Module Show_Files_Standard {
\\ we get more (include hidden too)
Module InnerWay (folder_path$, pattern$){
olddir$=dir$
dir folder_path$
\\ clear menu list
Menu
\\ + place export to menu, without showing
\\ ! sort to name
files ! + pattern$
If MenuItems>0 then {
For i=1 to MenuItems {
Print Menu$(i)+".exe"
}
}
dir olddir$
}
InnerWay "C:\Windows","*.exe"
}
Show_Files_Standard
</syntaxhighlight>
 
Like VbScript using external help, from a COM object.
 
We use an enumerator to iterate all file names and checked using like operator "~",and then we push them to end of stack (Data push to end), so we get first the first entered (we use stack here as a FIFO, using a New stack for temporary use), and we remove at the end all items and place them in an array. This array return from get_file$() and we make a second iterator for array, to get each end display it. The second iterator is not a com enumerator, but another type of object included in this interpreter. This iterator can get start and end position, defining a range and a direction too.
 
EnumFile is an object in an object. In expression we get the inner object. In While {} we get the outer object, and iterate or not (depends of state), so the inner object change. Because we get the first object at creation time, the first time when While structure found this object skips iteration.
 
Stack New {} make a block of a fresh stack of values, and at the exit attach the old stack (which for this block detached from execute object at the begin of block).
 
<syntaxhighlight lang="m2000 interpreter">
Module Show_Files {
Function get_files$ (folder_path$) {
\\ we get second argument using letter$ which pop from stack
pattern$=lcase$(Letter$)
Declare objfso "Scripting.FileSystemObject"
Method objfso, "GetFolder", folder_path$ as fc
With fc, "files" set files
\\ from revision 13 - version 9.4
With files, -4& as EnumFile
With EnumFile, "Name" as name$
Dim empty$()
=empty$()
Stack New {
While EnumFile {
If lcase$(name$) ~ pattern$ Then Data name$
}
\\ get stack values and fill an array
=Array$([])
}
}
Dim Name$()
Name$()=get_files$("C:\Windows","*.exe")
m=each(Name$())
While m {
Print Array$(m)
}
}
Show_Files
</syntaxhighlight>
 
=={{header|MACRO-10}}==
<syntaxhighlight lang="macro-10">
TITLE DIRWLK - Directory Walker
SUBTTL PDP-10 Assembly Language (MACRO-10 @ TOPS-20). KJX 2022.
 
SEARCH MONSYM,MACSYM ;Get system-call names.
.REQUIRE SYS:MACREL ;Macros: TMSG, EJSHLT, etc.
 
STDAC. ;Define standard register names.
 
JFN: BLOCK 1 ;Space for JFN (file-handle)
FSPEC: BLOCK 20 ;Space for file specification.
FSPECL= <.-FSPEC>*5 ;Length in chars of file-spec.
 
GO:: RESET% ;Initialize process.
TMSG <Please enter filespec, wildcards are allowed: >
HRROI T1,FSPEC ;Read into FSPEC.
MOVEI T2,FSPECL ;Maximum allowed characters.
SETZ T3, ;No Ctrl-R prompting.
RDTTY% ;Read string from terminal.
EJSHLT ; Print error-msg on errors.
 
MOVX T1,GJ%OLD!GJ%IFG!GJ%FLG!GJ%SHT ;Various flags.
HRROI T2,FSPEC ;File specification from above.
GTJFN% ;Get JFN for first matching file.
EJSHLT ; Print error-msg on errors.
MOVEM T1,JFN ;Save JFN.
 
DO.
MOVEI T1,.PRIOU ;Write to standard-output.
HRRZ T2,JFN ;JFN from above to decode.
SETZ T3, ;No flags.
JFNS% ;Decode filename and print it.
EJSHLT ; Print error-msg on errors.
TMSG <
> ;Print newline.
MOVE T1,JFN ;Get JFN into T1.
GNJFN% ;Get next matching file.
JRST [ HALTF% ; Halt program on failure.
JRST GO ]
LOOP. ;No error: Do it again.
ENDDO.
 
END GO
</syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
The built-in function <code>FileNames</code> does exactly this:
:<code>FileNames[]</code> lists all files in the current working directory.
Line 436 ⟶ 1,306:
:<code>FileNames[forms,dirs,n]</code> includes files that are in subdirectories up to n levels down.
Examples (find all files in current directory, find all png files in root directory):
<langsyntaxhighlight Mathematicalang="mathematica">FileNames["*"]
FileNames["*.png", $RootDirectory]</langsyntaxhighlight>
the result can be printed with Print /@ FileNames[....].
 
=={{header|MAXScript}}==
<langsyntaxhighlight lang="maxscript">getFiles "C:\\*.txt"</langsyntaxhighlight>
 
=={{header|Objective-CNanoquery}}==
<syntaxhighlight lang="nanoquery">import Nanoquery.IO
<lang objc>NSString *dir = @"/foo/bar";
 
for fname in new(File).listDir("/foo/bar")
// Pre-OS X 10.5
if lower(new(File, fname).getExtension()) = ".mp3"
NSArray *contents = [[NSFileManager defaultManager] directoryContentsAtPath:dir];
println filename
// OS X 10.5+
end
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dir error:NULL];
end</syntaxhighlight>
 
=={{header|Nemerle}}==
NSEnumerator *enm = [contents objectEnumerator];
<syntaxhighlight lang="nemerle">using System.Console;
NSString *file;
using System.IO;
while ((file = [enm nextObject]))
 
if ([[file pathExtension] isEqualToString:@"mp3"])
module DirWalk
NSLog(@"%@", file);</lang>
{
Main() : void
{
def files = Directory.GetFiles(@"C:\MyDir"); // retrieves only files
def files_subs = Directory.GetFileSystemEntries(@"C:\MyDir"); // also retrieves (but does not enter) sub-directories
// (like ls command)
foreach (file in files) WriteLine(file);
}
}</syntaxhighlight>
 
=={{header|NetRexx}}==
<syntaxhighlight lang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
 
import java.util.List
 
runSample(arg)
return
 
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method getFileNames(dirname, pattern) public static returns List
dir = File(dirname)
contents = dir.list()
fileNames = ArrayList()
loop fname over contents
if fname.matches(pattern) then do
fileNames.add(fname)
end
end fname
Collections.sort(fileNames)
return fileNames
 
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method runSample(arg) private static
parse arg dirname pattern
if dirname = '' then dirname = System.getProperty('user.dir')
if pattern = '' then pattern = '^RW.*\\.nrx$'
 
fileNames = getFileNames(dirname, pattern)
say 'Search of' dirname 'for files matching pattern "'pattern'" found' fileNames.size() 'files.'
loop fn = 0 while fn < fileNames.size()
say (fn + 1).right(5)':' fileNames.get(fn)
end fn
return
</syntaxhighlight>
{{out}}
<pre>
Search of /Users/projects/RosettaCode/netrexx for files matching pattern "^RW.*\.nrx$" found 5 files.
1: RWalkDir_Iter.nrx
2: RWebScraping.nrx
3: RWindowCreate.nrx
4: RWriteFloatArray.nrx
5: RWriteName3D01.nrx
</pre>
 
=={{header|Nim}}==
The “os” standard module provides several iterators to retrieve files or directories matching a pattern: <code>walkPattern</code> to retrieve files and directories, <code>walkFiles</code> to retrieve only files and <code>walkDirs</code> to retrieve only directories. The pattern is OS dependent but at least the <code>*.ext</code> notation is supported.
 
And there is the powerful <code>walkDir</code> to list the content of a directory specified by its name (without pattern).
Here is an example with <code>walkFiles</code> and a pattern:
 
<syntaxhighlight lang="nim">import os
 
for file in walkFiles "/foo/bar/*.mp3":
echo file</syntaxhighlight>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">use IO;
 
bundle Default {
Line 471 ⟶ 1,408:
}
}
}</langsyntaxhighlight>
 
=={{header|Objective-C}}==
<syntaxhighlight lang="objc">NSString *dir = @"/foo/bar";
 
// Pre-OS X 10.5
NSArray *contents = [[NSFileManager defaultManager] directoryContentsAtPath:dir];
// OS X 10.5+
NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dir error:NULL];
 
for (NSString *file in contents)
if ([[file pathExtension] isEqualToString:@"mp3"])
NSLog(@"%@", file);</syntaxhighlight>
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">#load "str.cma"
let contents = Array.to_list (Sys.readdir ".") in
let select pat str = Str.string_match (Str.regexp pat) str 0 in
List.filter (select ".*\\.jpg") contents</langsyntaxhighlight>
 
=={{header|Odin}}==
<syntaxhighlight lang="odin">package main
 
import "core:fmt"
import "core:path/filepath"
 
main :: proc() {
matches, _err := filepath.glob("*.odin")
for match in matches do fmt.println(match)
}</syntaxhighlight>
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">declare
[Path] = {Module.link ['x-oz://system/os/Path.ozf']}
[Regex] = {Module.link ['x-oz://contrib/regex']}
Line 488 ⟶ 1,448:
MatchingFiles = {Filter Files fun {$ File} {Regex.search Pattern File} \= false end}
in
{ForAll MatchingFiles System.showInfo}</langsyntaxhighlight>
 
=={{header|Pascal}}==
{{works with|Free Pascal}}
<syntaxhighlight lang="pascal">{$H+}
 
program Walk;
 
uses SysUtils;
 
var Res: TSearchRec;
Pattern, Path, Name: String;
FileAttr: LongInt;
Attr: Integer;
 
begin
Write('File pattern: ');
ReadLn(Pattern); { For example .\*.pas }
Attr := faAnyFile;
if FindFirst(Pattern, Attr, Res) = 0 then
begin
Path := ExtractFileDir(Pattern);
repeat
Name := ConcatPaths([Path, Res.Name]);
FileAttr := FileGetAttr(Name);
if FileAttr and faDirectory = 0 then
begin
{ Do something with file name }
WriteLn(Name);
end
until FindNext(Res) <> 0;
end;
FindClose(Res);
end.</syntaxhighlight>
 
=={{header|PascalABC.NET}}==
<syntaxhighlight lang="delphi">
begin
var path := 'C:\PABCWork.NET';
EnumerateFiles(path,'*.pas').PrintLines;
end.
</syntaxhighlight>
 
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">use 5.010;
opendir my $dh, '/home/foo/bar';
my $pattern = qr{ \A a }xmso; # match files whose first character is 'a'
say for grep { /php$/ } readdir $dh;
opendir my $dh, 'the_directory';
closedir $dh;</syntaxhighlight>
say for grep { $pattern } readdir $dh;
closedir $dh;</lang>
Or using globbing, with the <code>&lt;&gt;</code> operator,
<langsyntaxhighlight lang="perl">use 5.010; say while </home/foo/bar/*.php>;</langsyntaxhighlight>
Or the same with the builtin <code>glob()</code> function,
<langsyntaxhighlight lang="perl">my @filenames = glob('/home/foo/bar/*.php');</langsyntaxhighlight>
The <code>glob()</code> function takes any expression for its pattern, whereas <code>&lt;&gt;</code> is only for a literal.
<langsyntaxhighlight lang="perl">my $pattern = '*.c';
my @filenames = glob($pattern);</langsyntaxhighlight>
 
=={{header|Perl 6Phix}}==
{{libheader|Phix/basics}}
The <code>dir</code> function takes the directory to traverse, and optionally a named parameter <code>test</code>, which can for example be a regex:
The dir function accepts a DOS pattern, with some minor variations (eg "*" gets all files with no extension).
<lang perl6>.say for dir(".", :test(/foo/))</lang>
<!--<syntaxhighlight lang="phix">-->
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">columnize</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">dir</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"*.txt"</span><span style="color: #0000FF;">))[</span><span style="color: #000000;">D_NAME</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">))</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
copyright.txt
e-1millon.txt
ildump.txt
output.txt
readme.txt
_TODO.TXT
</pre>
 
=={{header|PHP}}==
{{works with|PHP|5.2.0}}
<langsyntaxhighlight lang="php">$pattern = 'php';
$dh = opendir('c:/foo/bar'); // Or '/home/foo/bar' for Linux
while (false !== ($file = readdir($dh)))
Line 522 ⟶ 1,536:
}
}
closedir($dh);</langsyntaxhighlight>
Or:
<langsyntaxhighlight lang="php">$pattern = 'php';
foreach (scandir('/home/foo/bar') as $file)
{
Line 534 ⟶ 1,548:
}
}
}</langsyntaxhighlight>
{{works with|PHP|<nowiki>4 >= 4.3.0 or 5</nowiki>}}
<langsyntaxhighlight lang="php">foreach (glob('/home/foo/bar/*.php') as $file){
echo "$file\n";
}</langsyntaxhighlight>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(for F (dir "@src/") # Iterate directory
(when (match '`(chop "s@.c") (chop F)) # Matches 's*.c'?
(println F) ) ) # Yes: Print it</langsyntaxhighlight>
{{out}}
<pre>"start.c"
Line 552 ⟶ 1,566:
 
=={{header|Pike}}==
<langsyntaxhighlight lang="pike">array(string) files = get_dir("/home/foo/bar");
foreach(files, string file)
write(file + "\n");</langsyntaxhighlight>
 
=={{header|Pop11}}==
Built-in procedure sys_file_match searches directories (or directory trees) using shell-like patterns:
<langsyntaxhighlight lang="pop11">lvars repp, fil;
;;; create path repeater
sys_file_match('*.p', '', false, 0) -> repp;
Line 565 ⟶ 1,579:
;;; print the file
printf(fil, '%s\n');
endwhile;</langsyntaxhighlight>
 
=={{header|PowerShell}}==
Since PowerShell is also a shell it should come as no surprise that this task is very simple. Listing the names of all text files, or the names of all files, starting with "f":
<langsyntaxhighlight lang="powershell">Get-ChildItem *.txt -Name
Get-ChildItem f* -Name</langsyntaxhighlight>
The <code>-Name</code> parameter tells the <code>Get-ChildItem</code> to return only the file names as string, otherwise a complete <code>FileInfo</code> or <code>DirectoryInfo</code> object would be returned, containing much more information than only the file name.
 
More complex matching can be accomplished by filtering the complete list of files using the <code>Where-Object</code> cmdlet. The following will output all file names that contain at least one vowel:
<langsyntaxhighlight lang="powershell">Get-ChildItem -Name | Where-Object { $_ -match '[aeiou]' }</langsyntaxhighlight>
 
=={{header|PureBasic}}==
The match is made using DOS wildcards. It could easily be modified to match based on a regular expression if desired (i.e. using the PCRE library).
<langsyntaxhighlight PureBasiclang="purebasic">Procedure walkDirectory(directory.s = "", pattern.s = "")
Protected directoryID
Line 596 ⟶ 1,610:
Input()
CloseConsole()
EndIf</langsyntaxhighlight>
 
=={{header|Python}}==
The [http://python.org/doc/lib/module-glob.html glob] library included with Python lists files matching shell-like patterns:
<langsyntaxhighlight lang="python">import glob
for filename in glob.glob('/foo/bar/*.mp3'):
print (filename)</langsyntaxhighlight>
Or manually:
<langsyntaxhighlight lang="python">import os
for filename in os.listdir('/foo/bar'):
if filename.endswith('.mp3'):
print (filename)</langsyntaxhighlight>
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">dir("/foo/bar", "mp3")</langsyntaxhighlight>
 
=={{header|RavenRacket}}==
 
<lang raven>'dir://.' open each as item
<syntaxhighlight lang="racket">
item m/\.txt$/ if "%(item)s\n" print</lang>
-> (for ([f (directory-list "/tmp")] #:when (regexp-match? "\\.rkt$" f))
(displayln f))
... *.rkt files ...
</syntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
The <code>dir</code> function takes the directory to traverse, and optionally a named parameter <code>test</code>, which is [https://docs.raku.org/routine/$TILDE$TILDE smart-matched] against the basename of each file (so for example we can use a regex):
<syntaxhighlight lang="raku" line>.say for dir ".", :test(/foo/);</syntaxhighlight>
 
=={{header|Rascal}}==
<langsyntaxhighlight lang="rascal">import IO;
public void Walk(loc a, str pattern){
for (entry <- listEntries(a))
endsWith(entry, pattern) ? println(entry);
}</langsyntaxhighlight>
 
=={{header|Raven}}==
<syntaxhighlight lang="raven">'dir://.' open each as item
item m/\.txt$/ if "%(item)s\n" print</syntaxhighlight>
 
=={{header|REXX}}==
{{works with|Regina}}
The following program was tested in a DOS window under Windows/XP and should work for all Microsoft Windows.
<syntaxhighlight lang="rexx">/*REXX program shows files in directory tree that match a given criteria*/
parse arg xdir; if xdir='' then xdir='\' /*Any DIR? Use default.*/
@.=0 /*default in case ADDRESS fails. */
trace off /*suppress REXX err msg for fails*/
address system 'DIR' xdir '/b /s' with output stem @. /*issue DIR cmd.*/
if rc\==0 then do /*an error happened?*/
say '***error!*** from DIR' xDIR /*indicate que pasa.*/
say 'return code=' rc /*show the Ret Code.*/
exit rc /*exit with the RC.*/
end /* [↑] bad address.*/
#=@.rc /*number of entries.*/
if #==0 then #=' no ' /*use a word, ¬zero.*/
say center('directory ' xdir " has " # ' matching entries.',79,'─')
 
do j=1 for #; say @.j; end /*show files that met criteria. */
 
exit @.0+rc /*stick a fork in it, we're done.*/</syntaxhighlight>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
 
###---------------------------------------
### Directory Tree Walk
### Look for FileType for Music and Video
 
fileType = [".avi", ".mp4", ".mpg", ".mkv", ".mp3", ".wmv" ]
 
dirList = []
musicList = []
 
###---------------------------------------
### Main
###-----------------------------------
### Start at this directory
searchVideoMusic("C:\Users\Umberto\")
 
see nl +"Number of Music and Videos files: " +len(musicList) +nl +nl
see musicList
See nl +"Finished" +nl
 
###=======================================
### Search for Video and Music files
 
Func searchVideoMusic(startDir)
 
ChDir(startDir + "Music") ### <<<== add Music subpath C:\Users\Umberto\Music
listDir( CurrentDir() )
 
ChDir(startDir + "Videos") ### <<<== add Videos subpath C:\Users\Umberto\Videos
listDir( CurrentDir() )
 
for searchDir in dirList ### Search Directory List for Music and Videos files
listDir(searchDir)
next
 
 
###==============================
### Find Files in Directory
 
Func listDir(dirName)
 
ChDir(dirName)
Try
###-------------------------------------
### Get SubDirectories
 
myListSub = Dir( CurrentDir() )
Catch
###-------------------------------------
### Error, Couldn't open the directory
 
See "ListDir Catch! " + CurrentDir() +" --- "+ cCatchError +nl
return
Done
 
for x in myListSub
if x[2]
thisDir = x[1]
 
if thisDir[1] = "."
### Do Nothing. Ignore dot.name
 
else
see nl +"Dir: " + CurrentDir() +"\"+ thisDir + nl
 
###----------------------------------------
### Directory Walk add to directory list
 
Add( dirList, (CurrentDir() +"\"+ thisDir))
ok
else
thisFile = x[1]
 
###-------------------------------
### Add Music or Video file type
 
for thisType in fileType
if ( substr(thisFile, thisType) ) ### <<<== Type of File from List
see " File: " + thisFile + nl
Add(musicList, (CurrentDir() +"\"+ thisFile))
ok
next
ok
next
return
 
###===============================================
 
</syntaxhighlight>
 
OUTPUT:
<pre>
 
Dir: C:\Users\Umberto\Music\Free YouTube Downloader
File: stock.mp3
File: big_buck_bunny.mp4
File: BowieNikolaTesla'ThePrestige'.mpg
File: BowieTesla'The Prestige'.wmv
File: Candyman.mp4
 
Dir: C:\Users\Umberto\Videos\Captures
File: drop.avi
 
Dir: C:\Users\Umberto\Videos\Free YouTube Downloader
File: GaryUSBondsQuarterToThree.avi
 
Dir: C:\Users\Umberto\Videos\HitomiTanaka[MIDE-219]
File: Joe.Versus.The.Volcano[1990].avi
File: SampleTheMythSanWa2005.mkv
File: stock.mp3
 
Dir: C:\Users\Umberto\Videos\The Prestige (2006)
File: BowieNikola'The Prestige'.mp4
File: BowieTeslaThe PrestigeConverted.mpg
File: 027_3xplanet_MDYD-895.avi
File: 3.mpg
File: HitomiTanaka[MIDE-219].mp4
File: MDYD-868.wmv
File: MIDE-253.mp4
File: MIDE_280.mp4
File: PPPD-432.avi
File: The.Prestige.2006.mkv
 
Number of Music and Videos files: 20
 
C:\Users\Umberto\Music\stock.mp3
C:\Users\Umberto\Videos\big_buck_bunny.mp4
C:\Users\Umberto\Videos\BowieNikolaTesla'ThePrestige'.mpg
C:\Users\Umberto\Videos\BowieTesla'The Prestige'.wmv
C:\Users\Umberto\Videos\Candyman.mp4
C:\Users\Umberto\Videos\drop.avi
C:\Users\Umberto\Videos\GaryUSBondsQuarterToThree.avi
C:\Users\Umberto\Videos\Joe.Versus.The.Volcano[1990].avi
C:\Users\Umberto\Videos\SampleTheMythSanWa2005.mkv
C:\Users\Umberto\Videos\stock.mp3
C:\Users\Umberto\Videos\Free YouTube Downloader\BowieNikola'The Prestige'.mp4
C:\Users\Umberto\Videos\Free YouTube Downloader\BowieTeslaThe PrestigeConverted.mpg
C:\Users\Umberto\Videos\HitomiTanaka[MIDE-219]\027_3xplanet_MDYD-895.avi
C:\Users\Umberto\Videos\HitomiTanaka[MIDE-219]\3.mpg
C:\Users\Umberto\Videos\HitomiTanaka[MIDE-219]\HitomiTanaka[MIDE-219].mp4
C:\Users\Umberto\Videos\HitomiTanaka[MIDE-219]\MDYD-868.wmv
C:\Users\Umberto\Videos\HitomiTanaka[MIDE-219]\MIDE-253.mp4
C:\Users\Umberto\Videos\HitomiTanaka[MIDE-219]\MIDE_280.mp4
C:\Users\Umberto\Videos\HitomiTanaka[MIDE-219]\PPPD-432.avi
C:\Users\Umberto\Videos\The Prestige (2006)\The.Prestige.2006.mkv
 
Finished
 
</pre>
 
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.7}}
The very first instruction of this program <code>VARS</code> returns the list of all current files and subdirectories. The rest of the code retains the names that comply with the pattern given in input, and which are not directories. To do so, the program attempts to recall the contents of each object on the stack through <code>RCL</code>: if an error occurs, the object is then a directory and shall not be processed further.
≪ VARS → filter list
≪ { } 1 list SIZE '''FOR''' j
list j GET
'''IFERR''' DUP RCL '''THEN''' DROP2
'''ELSE'''
DROP →STR 2 OVER SIZE 1 - SUB
'''IF''' DUP filter POS '''THEN''' + ELSE DROP '''END'''
'''END'''
'''NEXT'''
≫ ≫
'WKDIR' STO
 
"T" WKDIR
{{out}}
<pre>
1: { "T" "TESTPGM" "FACTN" }
</pre>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby"># Files under this directory:
Dir.glob('*') { |file| puts file }
 
Line 635 ⟶ 1,858:
puts file if file =~ pattern
end
end</langsyntaxhighlight>
 
=={{header|Run BASIC}}==
<syntaxhighlight lang="runbasic">files #g, DefaultDir$ + "\*.jpg" ' find all jpg files
if #g HASANSWER() then
count = #g rowcount() ' get count of files
for i = 1 to count
if #g hasanswer() then 'retrieve info for next file
#g nextfile$() 'print name of file
print #g NAME$()
end if
next
end if
wait</syntaxhighlight>
FILE ACCESSOR methods
 
#handle HASANSWER() - Return non-zero if the file accessor has at least one resulting row.
#handle ROWCOUNT() - Return the number of rows returned.
#handle NEXTFILE$() - Advance to the next row and return a comma delimited string for the next file (name, size, date, time, directory flag).
#handle NEXTFILE$([delimExpr$]) - Like NEXTFILE$() but you get to specify the delimiter instead of a comma.
#handle NAME$() - Return the name of the current file row.
#handle SIZE() - Return the size of the current file row.
#handle DATE$() - Return a string containing a formatted date for the current file row.
#handle TIME$() - Return a string containing a formatted time for the current file row.
#handle ISDIR() - Return non-zero if the current file row represents a directory instead of a file.
#handle RESET() - Reset the file accessor back to the beginning so you can read through them again.
#handle DATEFORMAT(template$) - Set the date format using a "mmm dd, yyyy" style template$.
#handle TIMEFORMAT(template$) - Set the time format using a "hh:mm:ss" style template$.
#handle ISNULL() - Returns zero (or false)
#handle DEBUG$() - Returns the string "Files"
 
OUTPUT:
<pre>
button.JPG
circuitbanner1.JPG
circuitbanner2.JPG
copy.jpg
homecomputerbanner1.JPG
mandelbrot.jpg</pre>
 
=={{header|Rust}}==
<syntaxhighlight lang="rust">extern crate docopt;
extern crate regex;
extern crate rustc_serialize;
 
use docopt::Docopt;
use regex::Regex;
 
const USAGE: &'static str = "
Usage: rosetta <pattern>
 
Walks the directory tree starting with the current working directory and
print filenames matching <pattern>.
";
 
#[derive(Debug, RustcDecodable)]
struct Args {
arg_pattern: String,
}
 
fn main() {
let args: Args = Docopt::new(USAGE)
.and_then(|d| d.decode())
.unwrap_or_else(|e| e.exit());
 
let re = Regex::new(&args.arg_pattern).unwrap();
let paths = std::fs::read_dir(".").unwrap();
 
for path in paths {
let path = path.unwrap().path();
let path = path.to_str().unwrap();
 
if re.is_match(path) {
println!("{}", path);
}
}
}</syntaxhighlight>
 
=={{header|Scala}}==
<syntaxhighlight lang="scala">import java.io.File
 
val dir = new File("/foo/bar").list()
dir.filter(file => file.endsWith(".mp3")).foreach(println)</syntaxhighlight>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "osfiles.s7i";
 
Line 650 ⟶ 1,956:
end if;
end for;
end func;</langsyntaxhighlight>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">'*.p[lm]'.glob.each { |file| say file } # Perl files under this directory</syntaxhighlight>
{{out}}
<pre>
x.pl
x.pm
</pre>
 
<syntaxhighlight lang="ruby">func file_match(Block callback, pattern=/\.txt\z/, path=Dir.cwd) {
path.open(\var dir_h) || return nil
dir_h.entries.each { |entry|
if (entry.basename ~~ pattern) {
callback(entry)
}
}
}
 
file_match(
path: %d'/tmp',
pattern: /\.p[lm]\z/i,
callback: { |file|
say file;
}
)</syntaxhighlight>
{{out}}
<pre>
/tmp/x.pl
/tmp/x.pm
</pre>
 
=={{header|Smalltalk}}==
<langsyntaxhighlight lang="smalltalk">(Directory name: 'a_directory')
allFilesMatching: '*.st' do: [ :f | (f name) displayNl ]</langsyntaxhighlight>
 
=={{header|Standard ML}}==
<syntaxhighlight lang="sml">fun dirEntries path =
let
fun loop strm =
case OS.FileSys.readDir strm of
SOME name => name :: loop strm
| NONE => []
val strm = OS.FileSys.openDir path
in
loop strm before OS.FileSys.closeDir strm
end</syntaxhighlight>
List all "hidden" files (starting with a dot in Unix) in the current directory:
<syntaxhighlight lang="sml">(print o concat o map (fn s => s ^ "\n") o List.filter (String.isPrefix ".") o dirEntries) "."</syntaxhighlight>
 
=={{header|Tcl}}==
For the current directory:
<langsyntaxhighlight lang="tcl">foreach filename [glob *.txt] {
puts $filename
}</langsyntaxhighlight>
For an arbitrary directory:
<langsyntaxhighlight lang="tcl">set dir /foo/bar
foreach filename [glob -directory $dir *.txt] {
puts $filename
### Or, if you only want the local filename part...
# puts [file tail $filename]
}</langsyntaxhighlight>
 
=={{header|Toka}}==
As with the C example, this uses a a POSIX extended regular expression as the pattern. The '''dir.listByPattern''' function used here was introduced in library revision 1.3.
<langsyntaxhighlight lang="toka">needs shell
" ." " .\\.txt$" dir.listByPattern</langsyntaxhighlight>
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">$$ MODE TUSCRIPT
files=FILE_NAMES (+,-std-)
fileswtxt= FILTER_INDEX (files,":*.txt:",-)
txtfiles= SELECT (files,#fileswtxt)</langsyntaxhighlight>
{{out}}
<pre>
Line 685 ⟶ 2,035:
txtfiles ROSETTA.TXT
</pre>
 
=={{header|TXR}}==
 
==== Using <code>glob</code> ====
 
<syntaxhighlight lang="txrlisp">(glob "/etc/*.conf")</syntaxhighlight>
 
{{out}}
 
<syntaxhighlight lang="txrlisp">("/etc/adduser.conf" "/etc/apg.conf" "/etc/blkid.conf" "/etc/brltty.conf"
"/etc/ca-certificates.conf" "/etc/colord.conf" "/etc/ddclient.conf"
"/etc/debconf.conf" "/etc/deluser.conf" "/etc/dnsmasq.conf" "/etc/ffserver.conf"
"/etc/fuse.conf" "/etc/gai.conf" "/etc/hdparm.conf" "/etc/host.conf"
"/etc/insserv.conf" "/etc/irssi.conf" "/etc/kernel-img.conf"
"/etc/kerneloops.conf" "/etc/knockd.conf" "/etc/ld.so.conf" "/etc/lftp.conf"
"/etc/logrotate.conf" "/etc/ltrace.conf" "/etc/mke2fs.conf" "/etc/mtools.conf"
"/etc/netscsid.conf" "/etc/nsswitch.conf" "/etc/ntp.conf" "/etc/pam.conf"
"/etc/pnm2ppa.conf" "/etc/popularity-contest.conf" "/etc/resolv.conf"
"/etc/rsyslog.conf" "/etc/sensors3.conf" "/etc/sysctl.conf" "/etc/ucf.conf"
"/etc/updatedb.conf" "/etc/usb_modeswitch.conf" "/etc/wodim.conf")</syntaxhighlight>
 
==== Using <code>open-directory</code> and <code>get-lines</code> ====
 
<syntaxhighlight lang="txrlisp">(mappend [iff (op ends-with ".conf") list] (get-lines (open-directory "/etc")))</syntaxhighlight>
 
{{out}}
 
<syntaxhighlight lang="txrlisp">("ddclient.conf" "gai.conf" "ucf.conf" "kernel-img.conf" "ltrace.conf"
"debconf.conf" "apg.conf" "adduser.conf" "mke2fs.conf" "colord.conf"
"kerneloops.conf" "fuse.conf" "hdparm.conf" "irssi.conf" "host.conf"
"ffserver.conf" "pam.conf" "sysctl.conf" "ld.so.conf" "dnsmasq.conf"
"insserv.conf" "brltty.conf" "deluser.conf" "netscsid.conf" "nsswitch.conf"
"mtools.conf" "wodim.conf" "updatedb.conf" "popularity-contest.conf"
"knockd.conf" "ntp.conf" "sensors3.conf" "resolv.conf" "blkid.conf"
"lftp.conf" "ca-certificates.conf" "usb_modeswitch.conf" "logrotate.conf"
"rsyslog.conf" "pnm2ppa.conf")</syntaxhighlight>
 
=={{header|UNIX Shell}}==
<syntaxhighlight lang="bash">ls -d *.c # *.c files in current directory
(cd mydir && ls -d *.c) # *.c files in mydir</syntaxhighlight>
<code>*.c</code> is a ''file name pattern'', also known as a ''glob pattern''. The shell expands each pattern to a sorted list of matching files. Details are in your shell's manual.
 
If there are no *.c files, <code>ls</code> fails with an error message.
 
=={{header|UnixPipes}}==
Here using grep for regexp.
<syntaxhighlight lang="bash">ls | grep '\.c$'</syntaxhighlight>
 
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
Sub show_files(folder_path,pattern)
Set objfso = CreateObject("Scripting.FileSystemObject")
For Each file In objfso.GetFolder(folder_path).Files
If InStr(file.Name,pattern) Then
WScript.StdOut.WriteLine file.Name
End If
Next
End Sub
 
Call show_files("C:\Windows",".exe")
</syntaxhighlight>
 
=={{header|Visual Basic .NET}}==
{{works with|Visual Basic .NET|9.0+}}
<langsyntaxhighlight lang="vbnet">'Using the OS pattern matching
For Each file In IO.Directory.GetFiles("\temp", "*.txt")
Console.WriteLine(file)
Line 701 ⟶ 2,112:
For Each file In IO.Directory.GetFiles("\temp").Where(Function(f) f Like "*.txt")
Console.WriteLine(file)
Next</langsyntaxhighlight>
 
=={{header|UNIX ShellWren}}==
{{libheader|Wren-pattern}}
<lang bash>ls -d *.c # *.c files in current directory
<syntaxhighlight lang="wren">import "io" for Directory
(cd mydir && ls -d *.c) # *.c files in mydir</lang>
import "./pattern" for Pattern
<code>*.c</code> is a ''file name pattern'', also known as a ''glob pattern''. The shell expands each pattern to a sorted list of matching files. Details are in your shell's manual.
 
var walk = Fn.new { |dir, pattern|
If there are no *.c files, <code>ls</code> fails with an error message.
if (!Directory.exists(dir)) Fiber.abort("Directory does not exist.")
var files = Directory.list(dir)
return files.where { |f| pattern.isMatch(f) }
}
 
// get all C header files beginning with 'a' or 'b'
=={{header|UnixPipes}}==
var p = Pattern.new("[a|b]+0^..h", Pattern.whole)
Here using grep for regexp.
for (f in walk.call("/usr/include", p)) System.print(f)</syntaxhighlight>
<lang bash>ls | grep '\.c$'</lang>
 
{{out}}
<pre>
aio.h
aliases.h
alloca.h
ar.h
argp.h
argz.h
asoundlib.h
assert.h
byteswap.h
</pre>
 
=={{header|zkl}}==
Unix glob, with wildcarding and options on file type, case folding and a few others.
<syntaxhighlight lang="zkl">File.glob("*.zkl") //--> list of matches</syntaxhighlight>
 
=={{header|Zsh}}==
Zsh has powerful filename generation features, which can filter by file names, permissions, size, type, etc.
<langsyntaxhighlight lang="bash">print -l -- *.c</langsyntaxhighlight>
 
{{omit from|AWK|Use a shell command: system("ls *.awk")}}
Line 727 ⟶ 2,159:
{{omit from|PARI/GP}}
{{omit from|Retro}}
{{omit from|TI-83 BASIC|Does not have a filesystem, just namespaced variables, which can't be listed from a program.}}
{{omit from|TI-89 BASIC|Does not have a filesystem, just namespaced variables, which can't be listed from a program.}}
{{omit from|Unlambda|Does not have file system support.}}
{{omit from|Axe}}
199

edits