env/mblaze/m.sh
Lucas 54f5477b0f m: allow showing summary of directories in list
Add a PATH-like variable M_LIST_PATH. If no arguments are given and this
new variable isn't empty, show a summary of those directories, without
showing stats for each subdirectory. This permits a more compact output
that comes handy when your directory tree is growing out of control.
2020-04-26 17:04:13 +00:00

154 lines
2.4 KiB
Bash

#!/bin/sh
# mblaze.env
# Written in 2020 by Lucas
# CC0 1.0 Universal/Public domain - No rights reserved
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <http://creativecommons.org/publicdomain/zero/1.0/>.
usage()
{
cat - <<. >&2
Usage:
${0##*/} f|fetch
${0##*/} l|list [dirs...]
${0##*/} r|read dir [dirs...]
${0##*/} s|scan [-a] dir [dirs...]
.
exit 1
}
_mlist_i_rec_ln()
{
if [ $# -eq 4 ]; then
printf "%6d unseen %3d flagged %6d msg %s\n" "$@"
else
printf "%6d unseen %3d flagged %6d msg\n" "$@"
fi
}
_mlist_i_rec()
{
tuc=0
tfc=0
tmc=0
entries=0
while IFS= read -r dir; do
mdirs "$dir" | mlist -i | tail -n 1 | {
IFS=" " read -r uc ut fc ft mc mt dummy
_mlist_i_rec_ln "$uc" "$fc" "$mc" "$dir"
tuc=$((tuc + uc))
tfc=$((tfc + fc))
tmc=$((tmc + mc))
entries=$((entries + 1))
}
done
if [ $entries -gt 1 ]; then
_mlist_i_rec_ln "$tuc" "$tfc" "$tmc"
fi
}
m_fetch_usage()
{
printf "Usage: %s f|fetch\n" "${0##*/}" >&2
exit 1
}
m_read_usage()
{
printf "Usage: %s r|read dir [dirs...]\n" "${0##*/}" >&2
exit 1
}
m_scan_usage()
{
printf "Usage: %s s|scan [-a] dir [dirs...]\n" "${0##*/}" >&2
exit 1
}
m_fetch()
{
if [ $# -ne 0 ]; then
m_fetch_usage
fi
printf "%s: fetch TBD.\n" >&2
exit 1
}
m_list()
{
pwd=$(pwd)
# cut(1) lists are 1-based, and +1 for leading slash
pwd_offset=$((${#pwd} + 2))
if [ $# -eq 0 ] && [ -n "$M_LIST_PATH" ]; then
oldIFS=$IFS
IFS=:
set -- $M_LIST_PATH
IFS=$oldIFS
printf "%s\n" "$@" | sort -t / | cut -c $pwd_offset- |
_mlist_i_rec
else
mdirs "${@:-.}" | sort -t / | cut -c $pwd_offset- | mlist -i
fi
}
m_read()
{
if [ $# -eq 0 ]; then
m_read_usage
fi
mdirs "$@" | mlist -s | msort -d | mthread | mless
}
m_scan()
{
mlist_flags=-s
while getopts a flag; do
case $flag in
a)
mlist_flags=
;;
*)
m_scan_usage
;;
esac
done
shift $(($OPTIND - 1))
if [ $# -eq 0 ]; then
m_scan_usage
fi
mdirs "$@" | mlist $mlist_flags | msort -d | mthread | mseq -S | mscan
}
if [ $# -lt 1 ]; then
usage
fi
cmd=$1
shift
case $cmd in
f|fetch)
m_fetch "$@"
;;
l|list)
m_list "$@"
;;
r|read)
m_read "$@"
;;
s|scan)
m_scan "$@"
;;
*)
usage
;;
esac