routine dir
Documentation for routine dir assembled from the following types:
class IO::Path
From IO::Path
(IO::Path) routine dir
Defined as:
multi sub dir(*%_) multi sub dir(IO::Path:D $path, |c) multi sub dir(IO() $path, |c) method dir(IO::Path:D: Mu :$test = $*SPEC.curupdir)
Returns the contents of a directory as a lazy list of IO::Path objects representing relative paths, filtered by smartmatching their names (as strings) against the :test parameter. The path of returned files will be absolute or relative depending on what $path is.
Since the tests are performed against Str arguments, not IO, the tests are executed in the $*CWD, instead of the target directory. When testing against file test operators, this won't work:
dir('mydir', test => { .IO.d })
while this will:
dir('mydir', test => { "mydir/$_".IO.d })
NOTE: a dir call opens a directory for reading, which counts towards maximum per-process open files for your program. Be sure to exhaust returned Seq before doing something like recursively performing more dir calls. You can exhaust it by assigning to a @-sigiled variable or simply looping over it. Note how examples below push further dirs to look through into an Array, rather than immediately calling dir on them. See also IO::Dir module that gives you finer control over closing dir handles.
Examples:
# To iterate over the contents of the current directory:
for dir() -> $file {
say $file;
}
# As before, but include even '.' and '..' which are filtered out by
# the default :test matcher:
for dir(test => *) -> $file {
say $file;
}
# To get the names of all .jpg and .jpeg files in the home directory of the current user:
my @jpegs = $*HOME.dir: test => /:i '.' jpe?g $/;
An example program that lists all files and directories recursively:
sub MAIN($dir = '.') {
my @todo = $dir.IO;
while @todo {
for @todo.pop.dir -> $path {
say $path.Str;
@todo.push: $path if $path.d;
}
}
}
A lazy way to find the first three files ending in ".p6" recursively starting from the current directory:
my @stack = '.'.IO;
my $perl-files = gather while @stack {
with @stack.pop {
when :d { @stack.append: .dir }
.take when .extension.lc eq 'p6'
}
}
.put for $perl-files[^3];