diff --git a/lacomp.zsh b/lacomp.zsh index e5e3ba6..d6bc31f 100755 --- a/lacomp.zsh +++ b/lacomp.zsh @@ -7,7 +7,7 @@ function ctime { } function mdate { - local dfmt="$(grep -m 1 -ioP '(?<=^Date\:\ ).*' ${fls[1]})" + local dfmt="$(grep -m 1 -oP '(?<=^[dD]ate\:\ ).*' $1)" date '+%s' -d "$dfmt" } @@ -16,19 +16,29 @@ while read LINE; do unset cts typeset -A cts - cts[${fls[1]}]=$(ctime "${fls[1]}") - cts[${fls[2]}]=$(ctime "${fls[2]}") + for i in $fls; do + cts[$i]=$(ctime "$i") + done unset mds typeset -A mds - mds[${fls[1]}]=$(mdate "${fls[1]}") - mds[${fls[2]}]=$(mdate "${fls[2]}") + for i in $fls; do + mds[$i]=$(mdate "$i") + done - if [ "${#cts}" -ne 2 ]; then - TMS=(${(nO)${(v)mds}}) - echo "${(k)mds[(r)${TMS[1]}]}" - else - TMS=(${(nO)${(v)cts}}) - echo "${(k)cts[(r)${TMS[1]}]}" - fi + while [ "${#fls}" -gt 1 ]; do + TMS=() + mf="" + if [ "${#mds}" -gt 1 ]; then + TMS=(${(nO)${(v)mds}}) + mf="${(k)mds[(r)${TMS[1]}]}" + unset "mds[${(b)mf}]" + else + TMS=(${(nO)${(v)cts}}) + mf="${(k)cts[(r)${TMS[1]}]}" + unset "cts[${(b)mf}]" + fi + fls=(${fls:#$mf}) + echo "$mf" + done done diff --git a/maildedupe.zsh b/maildedupe.zsh index d08f58c..1976a6f 100755 --- a/maildedupe.zsh +++ b/maildedupe.zsh @@ -3,29 +3,43 @@ fln=($@) flc=(${fln}) -fct="0" +idc="0" typeset -A fls for i in $flc; do + id="$(grep -m 1 -oP '(?<=^[mM]essage-[iI][dD]\:\ \<).*(?=\>)' $i)" - fls[$i]=$(grep -m 1 -ioP '(?<=^Message-ID\:\ \<).*(?=\>)' "$i") + if [ ! -z "$id" ]; then + fls[$i]="$id" - fct=$(( ${fct} + 1 )) - printf '%.40s: %20s\r' 'Message-IDs collected' "${fct}/${#fln}" >&2 + idc=$(( ${idc} + 1 )) + printf '%.40s: %20s\r' 'Message-IDs collected' "${idc}/${#fln}" >&2 + fi done -fct="0" -for k1 v1 in ${(kv)fls}; do - - for k2 v2 in ${(kv)fls}; do - if [[ "$v1" == "$v2" ]] && [[ "$k1" != "$k2" ]]; then - echo "$k1 $k2" - printf 'Message-ID duplicate: %s\n' "$v1" >&2 - fi - done - - fct=$(( ${fct} + 1 )) - unset "fls[$k1]" - - printf '%.40s: %20s\r' 'Message-IDs compared' "${fct}/${#fln}" >&2 +printf '\n' >&2 +typeset -A idfcnt +for v in $fls; do + idfcnt[$v]="$(( ${idfcnt[$v]:-0} + 1 ))" done + +fdc="0" +for k v in ${(kv)idfcnt}; do + if [ "$v" -gt 1 ]; then + FL=() + while true; do + FN="${(k)fls[(r)$k]}" + if [ ! -z "$FN" ]; then + unset "fls[$FN]" + FL+=("$FN") + else + break + fi + done + printf '%s\n' "$FL" + + fdc=$(( ${fdc} + ${#FL} )) + printf '%.40s: %20s\r' 'Message-ID duplicates' "${fdc}/${idc}" >&2 + fi +done +[ "$fdc" -gt 0 ] && printf '\n' >&2