#!/usr/bin/perl
use
Term::ANSIColor
qw[ :constants color ]
;
$Term::ANSIColor::AUTORESET
= 1 ;
use
List::Util
qw [
minstr maxstr reduce min sum0 sum reduce ] ;
getopts
',.@:0M:W:bd:lpv:'
, \
my
%o
;
chdir
"$ARGV[0]"
or
do
{
print
STDERR BOLD RED
"Cannot change into dir `$ARGV[0]'\n"
;
exit
1 }
if
@ARGV
;
$| = 1 ;
$o
{d} //= 5 ;
$o
{v} //= 1 ;
my
$T
= catdir
''
,
''
;
dig_simple () ;
sub
d3 ( $ ) {
my
$ret
=
shift
;
$ret
=~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/g
if
$o
{
','
} ;
return
$ret
;
}
sub
getfiles_atdepth ( $ ) {
my
$d
= (
shift
) // 1 ;
my
$S
=
$d
>= 0 ?
'*'
:
'..'
;
$d
=
abs
$d
;
my
$ptn
=
join
$T
,
$d
== 0 ?
'.'
: ( (
$S
)x(
$d
-1) ,
$o
{
"."
} ?
".*"
:
$S
) ;
$ptn
=~ s/\.\.$/..
$T
*/ ;
print
"[$ptn] "
if
$o
{p} ;
return
glob
"$ptn"
;
}
sub
alt_say ( @ ) {
my
$f
= 1 ;
my
@L
=
map
{
$f
^= 1 ;
$f
? FAINT
$_
:
$_
}
@_
;
print
join
" "
,
@L
;
}
sub
uniq ( @ ) {
my
%s
= () ;
grep
!
$s
{
$_
} ++ ,
@_
}
sub
dig_simple {
my
@H
=
qw [
Depth Non-dir-files Dir-Files ] ;
grep
{
$_
=
$_
. FAINT
"(symbolic links)"
}
@H
[1,2] ;
push
@H
,
"Sum_FileSize_inBytes"
if
$o
{b} ;
if
(
defined
$o
{M} ) {
push
@H
, YELLOW
"[File-numbers of sub-directories that are among the most]"
;
push
@H
,
"Such sub-directories .."
;
}
if
(
defined
$o
{W} ) {
push
@H
, YELLOW
"[Frequent Num of the same file (bottom) name]"
;
push
@H
,
"Such (bottom) file names .. "
;
}
if
( !
defined
$o
{M} && !
defined
$o
{W} ) {
push
@H
, (CYAN
"NonDirFile-examples"
).
".."
, (GREEN
"DirFile-examples"
).
".."
if
$o
{v} > 0 ;
}
print
+
join
(
"\t"
,
@H
) .
"\n--\n"
;
$o
{d} +=
$o
{
'@'
}
if
defined
$o
{
'@'
} &&
$o
{d} <
$o
{
'@'
} ;
my
@dep
=
$o
{d} >= 0 ? (
$o
{0} ? 0:1) ..
$o
{d} :
reverse
$o
{d} .. (
$o
{0} ? 0:-1) ;
@dep
=
grep
{
$_
>=
$o
{
'@'
}}
@dep
if
defined
$o
{
'@'
} ;
for
(
@dep
) {
my
@files
= getfiles_atdepth
$_
;
@files
=
grep
{ ! m/(\A|
$T
)\.{1,2}\Z/ }
@files
if
$o
{
"."
} ;
my
@dirfiles
=
grep
{ -d
$_
and
$_
.=
""
}
@files
;
my
@ndfiles
=
grep
{ ! -d }
@files
;
my
$dL
=
grep
{ -l }
@dirfiles
;
my
$nL
=
grep
{ -l }
@ndfiles
;
my
@out
;
push
@out
,
"$_:"
;
push
@out
,
do
{
my
$tmp
=
scalar
@ndfiles
;
$tmp
.= FAINT
"($nL)"
if
$nL
; d3
$tmp
} ;
push
@out
,
do
{
my
$tmp
=
scalar
@dirfiles
;
$tmp
.= FAINT
"($dL)"
if
$dL
; d3
$tmp
} ;
push
@out
,
do
{
$_
= sum0
map
-s // 0 ,
@ndfiles
; d3(
$_
) }
if
$o
{b} ;
print
join
"\t"
,
@out
;
if
(
defined
$o
{M} ) {
my
@dirs0
=
@dirfiles
;
my
@fnums
=
map
{
opendir
my
$dh
,
$_
or
print
RED
$_
;
my
@t
=
grep
{ !/\A\.{1,2}\Z/}
readdir
$dh
;
closedir
$dh
;
scalar
@t
}
grep
-r,
@dirs0
;
my
@t
=
splice
@{ [
sort
{
$b
->[1] <=>
$a
->[1] }
map
{[
$_
,
$fnums
[
$_
]]} 0 ..
$#fnums
] } , 0,
$o
{M} ;
print
YELLOW
"\t["
. (
join
", "
,
map
{
$_
->[1]}
@t
) .
"]\t"
;
alt_say
map
{
$dirs0
[
$_
-> [0] ] }
@t
;
}
if
(
defined
$o
{W} ) {
my
%c
;
$c
{
$_
} ++
for
map
{ (splitdir
$_
)[-1] . (-d
$_
?
$T
:
''
) }
@files
;
my
@k
=
splice
@{[
sort
{
$c
{
$b
} <=>
$c
{
$a
} ||
$a
cmp
$b
}
keys
%c
]} , 0 ,
$o
{W} ;
print
YELLOW
"\t["
. (
join
", "
,
map
{
$c
{
$_
} }
@k
) .
"]\t"
;
alt_say
@k
;
}
if
( !
defined
$o
{M} && !
defined
$o
{W} ){
print
"\n"
and
next
if
$o
{v} == 0 ;
print
"\t"
;
my
@R
= () ;
push
@R
, & rep (
@ndfiles
) ;
grep
{
$_
= CYAN & botD (
$_
) }
@R
;
alt_say
@R
;
print
"\t"
;
@R
= () ;
push
@R
, & rep (
@dirfiles
) ;
grep
{
$_
= GREEN & botD (
$_
) .
'/'
}
@R
;
alt_say
@R
;
}
print
color (
"reset"
) ;
print
"\n"
;
last
if
@dirfiles
== 0 && !
$o
{
'.'
} &&
$o
{d} > 0 ;
}
}
sub
botD( $ ) {
my
@t
= splitdir
shift
;
my
@t1
=
splice
@t
, - min(
scalar
@t
,
$o
{v} ) ;
my
$i
=
$o
{d} >= 0 ?
'-'
:
'^'
;
@t
=
@t
?
$i
x
@t
: () ;
return
join
$T
,
@t
,
@t1
;
}
sub
rep ( @ ) {
sub
sd { splitdir
shift
} ;
sub
len {
length
shift
} ;
my
@L
= () ;
if
( 1 or !
$o
{l} ){
push
@L
, reduce { (sd
$a
)[-1] lt (sd
$b
)[-1] ||
$a
lt
$b
?
$a
:
$b
}
grep
{
$_
}
@_
;
push
@L
, reduce { (sd
$a
)[-1] gt (sd
$b
)[-1] ||
$a
gt
$b
?
$a
:
$b
}
grep
{
$_
}
@_
;
}
if
(
$o
{l}) {
push
@L
,reduce { len ((sd
$a
)[-1]) < len((sd
$b
)[-1]) || (sd
$a
)[-1] lt (sd
$b
)[-1] ?
$a
:
$b
}
grep
{
$_
ne
$L
[0] and
$_
ne
$L
[1] }
grep
$_
,
@_
;
push
@L
,reduce { len ((sd
$a
)[-1]) > len((sd
$b
)[-1]) || (sd
$a
)[-1] gt (sd
$b
)[-1] ?
$a
:
$b
}
grep
{
$_
ne
$L
[0] and
$_
ne
$L
[1] and
$_
ne
$L
[2] }
grep
$_
,
@_
;
}
return
uniq
grep
{
defined
}
@L
;
}
sub
VERSION_MESSAGE {}
sub
HELP_MESSAGE {
$ARGV
[1] //=
''
;
open
my
$FH
,
'<'
, $0 ;
while
(<
$FH
>){
s/\$0/
$Script
/g ;
print
$_
if
s/^=head1// .. s/^=cut// and
$ARGV
[1] =~ /^o(p(t(i(o(ns?)?)?)?)?)?$/i ? m/^\s+\-/ : 1;
}
close
$FH
;
exit
0 ;
}