in reply to Traverse through directory structure and print in required format

use File::Basename qw( basename ); sub visit { my ($dir, $level) = @_; $level ||= 0; my $group_indent = ' ' x (2*$level); ++$level; my $child_indent = ' ' x (2*$level); printf($group_indent."Group: %s {\n", $level ? basename($dir) : $di +r); my @file_names = do { opendir(my $dh, $dir); grep !/^\.\.?\z/, readdir($dh) }; for my $fn (@file_names) { my $qfn = "$dir/$fn"; if (-d $qfn) { visit($qfn, $level); } else { print($child_indent."File: $fn ($qfn)\n"); } } print($group_indent."}\n"); } visit('/proj/newdata');

Possible improvements:

Update: Was missing top level Group. Fixed.

Replies are listed 'Best First'.
Re^2: Traverse through directory structure and print in required format
by ikegami (Patriarch) on Mar 14, 2011 at 23:13 UTC
    This includes all the possible improvements I mentioned:
    use Path::Class qw( dir ); sub visit { my ($dir, $level) = @_; $level ||= 0; my $group_indent = ' ' x (2*$level); ++$level; my $child_indent = ' ' x (2*$level); printf($group_indent."Group: %s {\n", $level ? $dir->basename : $di +r); for my $file (dir($dir)->children()) { if ($file->is_dir) { visit($file, $level); } else { printf($child_indent."File: %s (%s)\n", $file->basename, $fil +e); } } print($group_indent."}\n"); } visit('/proj/newdata');

    Update: Was missing top level Group. Fixed.