diff --git a/sh/lsz b/sh/lsz index f2f4389..3457220 100755 --- a/sh/lsz +++ b/sh/lsz @@ -1,7 +1,7 @@ #!/bin/zsh -# TODO: safe-ify echos and prints -local din=${1:-$(pwd)} -din=${din%/} # TODO: hackish + +emulate -L zsh +setopt ksh_typeset typeset_silent local -A unames gnames us while IFS=: read -rA A; do unames[${A[3]}]=${A[1]} done < /etc/passwd @@ -10,7 +10,7 @@ for x in $(groups); do us[$x]=1 done local -a colors colors=(bla red gre yel blu pur cya whi) -local i= $=colors ${(U)=colors} clr=$'\e[0m' +local i $=colors ${(U)=colors} clr=$'\e[0m' for i in {0..7}; do local x=${colors[$((i+1))]} eval "$x=$'\\e[3${i}m'" "${(U)x}=$'\\e[9${i}m'" @@ -19,8 +19,6 @@ done local s=1 m h d y B=1 K M G T noglob let m=60*s h=60*m d=24*h y=365*d K=1024*B M=1024*K G=1024*M T=1024*G -local -a ft fut fct fs fus fcs - local s_ft=' y*10 y BLA y*2 y blu @@ -52,32 +50,24 @@ local permcolors="$BLA $WHI $yel $YEL $blu $BLU $gre $GRE" permcolors=($=permcolors) # chr dir blk file sym -local typecolors="$RED $BLA $BLA $BLA $BLU $BLA $BLA $BLA $clr $BLA $CYA" +local typecolors="$RED $BLA $YEL $BLA $BLU $BLA $yel $BLA $clr $BLA $CYA" typecolors=($=typecolors) +local ft fs local min unit color for min unit color in $=s_ft; do - # TODO: consider dereferencing color ft+=($(($min)) $unit $color) done for min unit color in $=s_fs; do fs+=($(($min)) $unit $color) done -trunc() { # deprecate me for speed... - local len=${1:-$COLUMNS} c='…' L - local end=$((len-1)) - while read -r L; do - [ ${#L} -gt $len ] && echo ${L[1,$end]}$c || echo $L - done -} - prettify() { local min unit color for min unit color in ${(P)2}; do [ $1 -lt $min ] && continue local unitified=$(($1/$unit)) - echo -n "${(P)color}${(l:4:)unitified}$clr$unit " + echo -n "${(P)color}${(l:4:)unitified}$clr$unit" break done } @@ -99,26 +89,48 @@ permprint() { } typeprint() { - echo -n ${typecolors[$(($1+1))]} #${(l:3:)1} + echo -n ${typecolors[$(($1+1))]} } local now=$(date +%s) dateprint() { [ $1 -lt 32 ] \ - && echo -n "$BLA N/A$clr " \ + && echo -n "$BLA N/A$clr" \ || prettify $((now-$1)) ft + echo -n ' ' } -local dinf=$(readlink -f $din/) -local f="$dinf/*(D)" +_lsz() { + local din=${1:-$(pwd)} + din=${din%/} + + local dinf=$(readlink -f ${din:-/}) + local glob=$dinf + [ -d "$dinf" ] && glob=$dinf/*(DN) + + local count=$2 + [ $count -gt 1 ] && echo "$WHI$dinf" + + local -a matches + matches=(${~glob}) + [ ${#matches} -eq 0 ] && return + + stat -t -- ${matches[@]} | while read -r; do + __lsz "$REPLY" "$dinf" + done +} + +__lsz() { + local A dinf=$2 + read -rA A <<<$1 -stat -t -- ${~f} | while read -rA A; do local uid=${A[-12]} gid=${A[-11]} is_me=0 is_us=0 local uname=${unames[$uid]} gname=${gnames[$gid]} [ $uid -eq $UID ] && is_me=1 [ -n "$gname" ] && [[ ${us[$gname]} -eq 1 ]] && is_us=1 - local bits=$((16#${A[-13]})) type= uperm= gperm= operm= our_perm= + local bits type uperm gperm operm our_perm + bits=$((16#${A[-13]})) let 'type=(bits & 8#170000) >> 12' let 'uperm=(bits & 8#700) >> 6' let 'gperm=(bits & 8#70) >> 3' @@ -126,14 +138,17 @@ stat -t -- ${~f} | while read -rA A; do let 'our_perm=(is_me?uperm:0) | (is_us?gperm:0) | operm' case $type in - 2) echo -n ' c ' ;; - 6) echo -n ' b ' ;; - 4) echo -n ' / ' ;; - 10) echo -n ' > ' ;; + 2) echo -n ' c' ;; + 6) echo -n ' b' ;; + 4) echo -n ' /' ;; + 10) echo -n ' >' ;; *) prettify ${A[-15]} fs ;; esac - permprint $our_perm + true && { + echo -n ' ' + permprint $our_perm + } true && { echo -n ' ' @@ -157,4 +172,7 @@ stat -t -- ${~f} | while read -rA A; do n=${n##$dinf/} typeprint $type echo $n$clr -done +} + +local f +for f; _lsz $f ${#@}