in reply to tree command
Cool! Here's a minor patch to make it ignore hidden entries (those starting with a dot) by default, and add an -a flag for showing those after all, similar to the one that ls has:
--- tree.pl 2015-10-13 11:59:07.665138800 +0200 +++ tree_afr.pl 2015-10-13 11:58:27.145867300 +0200 @@ -5,11 +5,13 @@ use Pod::Usage; my ( + $showall, # show all, including entries starting with . $showfiles, # show also files $showlinks, # show also a symlink's target ); help() unless GetOptions( + a => \$showall, l => \$showlinks, f => \$showfiles, 'h|help' => \&help, @@ -33,6 +35,7 @@ opendir my $dh, $path or die "Couldn't read $path: $!\n"; # Get all directory content - leaving out files unless asked for my(@content) = grep { !/^\.\.?$/ and ( $showfiles or not -f "$pat +h/$_" ) } readdir $dh; + @content = grep { !/^\./ } @content unless $showall; closedir $dh; # How many eitems are in the directory?
Without this I get a huge tree full of subtrees like .cpan, .git and so on.
EDIT: since this is such a useful little thing, I couldn't keep myself from changing it to Unicode box-drawing characters and also formatting the code according to my preferences:
#!/bin/env perl
use Modern::Perl '2014';
no warnings 'experimental';
use feature 'signatures';
# core modules
use Getopt::Long qw(:config no_ignore_case);
use Pod::Usage;
# line-drawing characters
our %line = (
"horizontal" => "──",
"indent" => " ",
"vertical" => "│",
"branch" => "├",
"corner" => "└",
);
# options
our %opts;
# run program
exit MAIN();
sub MAIN {
# grab options, display help on error
help() unless GetOptions(
a => \$opts{'showall'}, # show all, including entries starting with .
l => \$opts{'showlinks'}, # show also a symlink's target
f => \$opts{'showfiles'}, # also show files
'h|help' => \&help,
'm|man' => \&man,
);
# traverse each specified directory, or . if none was given
foreach my $path (@ARGV ? @ARGV : '.') {
say $path;
traverse($path);
}
}
sub help { pod2usage(-verbose=>1); }
sub man { pod2usage(-verbose=>2); }
sub traverse($path, $depth = '') {
# Open the directory
opendir my $dh, $path
or die "Could not read $path: $!\n";
# Get all directory content - leaving out files unless asked for
my @content =
grep { !/^\.\.?$/ }
grep { $opts{'showall'} or !/^\./ }
grep { $opts{'showfiles'} or not -f "$path/$_" }
readdir $dh;
closedir $dh
or die "Could not close $path: $!\n";
# Number of elements yet to be printed
my $remaining = scalar @content;
# Prepare the standard indent
my $indent = $depth . $line{'vertical'} . $line{'indent'};
# Print all the elements
foreach my $name (@content) {
my $fullname = "$path/$name";
# Prepare indent
$indent = $depth . " " . $line{'indent'} unless --$remaining;
print $depth, ($remaining ? $line{'branch'} : $line{'corner'}), $line{'horizontal'} , $name;
# Is it a link?
if (-l $fullname) {
# Shall they be shown as such
if($opts{'showlinks'}) {
print " -> ", readlink $fullname;
}
print "\n";
next;
}
print "\n";
# Traverse if it's a subdirectory
traverse($fullname, $indent) if -d $fullname;
}
return;
}
=head1 NAME
tree - A script to show a "graphical" representation of a directory structure
=head1 SYNOPSIS
tree options path...
=head1 DESCRIPTION
tree will show a "graphical" representation of a directory structure, including
all files (when B<-f> specified) and link targets (when B<-l> specified).
=head1 OPTIONS
=over 4
=item B<-f>
Show also files.
=item B<-l>
Shhow also link targets.
=item B<-h>
=item B<--help>
show a short help page.
=item B<-m>
=item B<--man>
Show the man-page.
=back
=head1 AUTHOR
Skeeve, member of perlmonks.org (perlmonks DOT org DOT Skeeve AT XoXy DOT net)
Minor changes and updates by Apple Fritter, a fellow Perl monk
=cut
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: tree command
by Skeeve (Parson) on Oct 13, 2015 at 11:50 UTC |