#!/usr/bin/perl # Filesystem listing utility use Fcntl ':mode'; my @BASE = (); my $MODE = 'file'; my $TIMESTAMPS = 1; my $TIMET_FMT = 'X'; my %OPT = (); foreach my $arg ( @ARGV ) { if ( $arg eq '-' ) { $MODE = 'stdin'; } elsif ( $arg =~ /^\-+time/ ) { $TIMESTAMPS = 0; } elsif ( $arg =~ /^\-+dect/ ) { $TIMET_FMT = 'd'; } elsif ( $arg =~ /^\-+(.+?)\=(.+)/ ) { $OPT{$1} = $2; } elsif ( $arg =~ /^\-+(.+?)/ ) { $OPT{$1} = 1; } else { push ( @BASE, $arg ); } } if ( ( $MODE eq 'file' ) && ( scalar(@BASE) == 0 ) ) { push ( @BASE, '.' ); } foreach my $f ( @BASE ) { dy ( $f ); } if ( $MODE eq 'stdin' ) { my $f; while ( defined ( $f = ) ) { chomp ( $f ); dy ( $f ); } } exit(0); sub dy { my ( $x ) = @_; my $FPATH = $x; $FSIZE = -1; $FPATH = $1 if ( $FPATH =~ /^(.+?)\/$/ ); $FPATH .= '/' if ( -d "$FPATH" ); if ( !-e "$FPATH" ) { print ("ERROR existence failure '$FPATH'\n"); return; } my @S = stat ( $FPATH ); if ( $FSIZE < 0 ) { $FSIZE = $S[7]; } my $KB = $FSIZE; $KB = (' 'x(10-length($KB))).$KB; my $TY = 'f'; if ( S_ISDIR ($S[2]) ) { $TY = 'd'; } elsif ( S_ISBLK ($S[2]) ) { $TY = 'b'; } elsif ( S_ISCHR ($S[2]) ) { $TY = 'c'; } elsif ( S_ISFIFO ($S[2]) ) { $TY = 'p'; } elsif ( S_ISSOCK ($S[2]) ) { $TY = 's'; } elsif ( S_ISLNK ($S[2]) ) { $TY = 'l'; } if ( ( $S[2] & 0111 ) && ( $TY eq 'f' ) ) { $TY = 'x'; } my $PER = sprintf ( "%03o", $S[2] & 0777 ); my $UID = $S[4]; $UID = (' 'x(4-length($UID))).$UID; my $LI = $S[3]; my $TIM = sprintf ( "%08$TIMET_FMT", $S[9] ); if ( $TIMESTAMPS == 1 ) { $TIM = mylocaltime ( $S[9] ); } print ( "$TIM $KB $TY $PER $UID $LI ".($FPATH)."\n"); if ( $TY eq 'd' ) { my ( $dirfd, $filepath ); return if ( !opendir ( $dirfd, $FPATH ) ); while ( defined ( $filepath = readdir ( $dirfd ) ) ) { next if ( $filepath eq '.' ); next if ( $filepath eq '..' ); $filepath = $FPATH . $filepath; dy ( $filepath ); } closedir ( $dirfd ); } return; } sub mylocaltime { my ( $tm ) = @_; $tm = time() if ( !defined($tm) ); my ( $sec, $min, $hr, $day, $mon, $yr, $wday, $yday, $foo ) = localtime ( $tm ); $mon++; $yr += 1900; return ( sprintf ( '%04d-%02d-%02d %02d:%02d:%02d', $yr, $mon, $day, $hr, $min, $sec ) ); }