Directories and the File System

use v5.36;
use autodie;

opendir(my $dh, '.');
my @entries = grep { !/^\.\.?$/ } readdir $dh;     # skip . and ..
closedir $dh;

my @perl_files = glob '*.pl';                      # shell-style globbing
my @all_logs   = glob 'logs/{app,error}*.log';

mkdir 'output';
mkdir 'output/sub' unless -d 'output/sub';
rmdir 'output/sub';
use File::Path qw(make_path remove_tree);
make_path('a/b/c');
remove_tree('a');

use Cwd qw(getcwd abs_path);
say getcwd();
chdir '/tmp';

use File::Basename qw(basename dirname fileparse);
my ($name, $dir, $suffix) = fileparse('/var/log/app.log', qr/\.[^.]*/);   # ('app', '/var/log/', '.log')

use File::Spec;                                    # portable path handling
my $path = File::Spec->catfile('dir', 'sub', 'file.txt');

# Recursive traversal
use File::Find;
find(sub {
    return unless -f && /\.log$/;
    say "$File::Find::name: ", -s _;               # _ reuses the last stat result
}, '/var/log');

# Modern alternatives (CPAN)
use Path::Tiny;
my $iter = path('/var/log')->iterator({ recurse => 1 });
while (my $p = $iter->()) { say $p if $p =~ /\.log$/ }
path('a/b')->mkpath; path('a')->remove_tree;
say path('/etc/hosts')->basename;
use File::Find::Rule
…