#!/usr/bin/perl use strict; use warnings; use File::Find; # Faulheit =) use File::Spec; # Portabilit??t use Getopt::Std; # standard my %opts; # -e: folge symlinks # -d path: path anstelle . # -i n: wieviele Leerzeichen zur Einr??ckung (default 2) getopts('ed:i:', \%opts); my $indent = defined $opts{i} ? $opts{i} : 2; my $dir = defined $opts{d}? $opts{d} : "."; { my %dirs; find( {wanted => sub { my $name = $File::Find::name; # Pfad in einzelne Directories splitten my @dirs = File::Spec->splitdir($name); shift @dirs; # das erste . verschwinden lassen # im falle eines verzeichnisses eine hashref, ansonsten # der leere string pushref(\%dirs, @dirs, -d $_ ? {} : ""); }, follow => $opts{e}}, $dir); print_nice(\%dirs,0); } sub print_nice { my ($hash, $level) = @_; foreach my $key (sort keys %$hash) { print " " x ($level * $indent); # einr??ckung print $key; my $value = $hash->{$key}; print "/" if ref $value; print $/; if (ref $value) { print_nice($value, $level + 1); } } } sub pushref { # gegeben eine reihe von strings, etwa A, B, C, werden # in einen hash eingef??gt: $dir->{A}->{B}->{C} = $value my $value = pop; my ($dir,@dirs) = @_; my $ref = \$dir; for (@dirs) { $ref = \$$ref->{$_}; } $$ref = $value; $_[0] = $dir; }