util: fit dedupe into a 80x48 screen

This commit is contained in:
Connor Olding 2022-10-05 01:35:48 -07:00
parent 79fdae6e2d
commit c5808b668c

View File

@ -1,5 +1,4 @@
#!/usr/bin/env sh #!/usr/bin/env sh
# Copyright (C) 2022 Connor Olding # Copyright (C) 2022 Connor Olding
usage='dedupe [OPTION...] {SOURCE} {TARGET} [FILE...] usage='dedupe [OPTION...] {SOURCE} {TARGET} [FILE...]
@ -14,8 +13,15 @@ Optional file arguments allow for finer control of the order of files seen.
This software is provided WITHOUT WARRANTY under the terms of the ISC license. This software is provided WITHOUT WARRANTY under the terms of the ISC license.
' '
read -r program <<'EOF' read program <<'EOF'
BEGIN{if(!D){print U;exit 64}E=(Q="'")"\"'\""Q;H=(G=".")(F="/");I=" -- "Q;J="[^/]*/";sub(F"?$",F,D)gsub(Q,E,D)}function C(x){if(X=system(x))exit X}{if((p=$2)==B){print V;exit 65}for(r=z=i=d=B;d!=!i;i++){b=a=p;d=sub("/.*",B,a);sub(J,B,p);if(a==G G)e=!sub(J,B,z);else z=a==G?z:b!=a?z a F:z a;if(e||!i&&!a){print W;exit 65}}P=p=!z?H:z;if((o=O[$1])==p)next;gsub(Q,E,P);M=m=D P;gsub("/[^/]+$",B,M);if(!u[M]++)C("mkdir -p"I M Q);if(o){T=split(o,t,F);S=split(p,s,F);for(i=1;t[i]==s[i];i++);for(j=i;j<S;j++)r=r G H;for(j=i;j<T;j++)r=r t[j]F;r=h?o:r t[T];gsub(Q,E,r);C("ln"(h?I D:" -s"I)r"' '"m Q);next}O[$1]=p;C("cp -i"I P"' '"m Q)} BEGIN{if(!D){print U;exit 64}E=(Q="'")"\\"'\\""Q;H=(G=".")(F="/");I=" -- "Q;J="\
[^/]*/";sub(F"?$",F,D)gsub(Q,E,D)}function C(x){if(X=system(x))exit X}{if((p=$2\
)==B){print V;exit 65}for(r=z=i=d=B;d!=!i;i++){b=a=p;d=sub("/.*",B,a);sub(J,B,\
p);if(a==G G)e=!sub(J,B,z);else z=a==G?z:b!=a?z a F:z a;if(e||!i&&!a){print W;\
exit 65}}P=p=!z?H:z;if((o=O[$1])==p)next;gsub(Q,E,P);M=m=D P;gsub("/[^/]+$",B,\
M);if(!u[M]++)C("mkdir -p"I M Q);if(o){T=split(o,t,F);S=split(p,s,F);for(i=1;t\
[i]==s[i];i++);for(j=i;j<S;j++)r=r G H;for(j=i;j<T;j++)r=r t[j]F;r=h?o:r t[T];\
gsub(Q,E,r);C("ln"(h?I D:" -s"I)r"' '"m Q);next}O[$1]=p;C("cp -i"I P"' '"m Q)}
EOF EOF
die() { printf '\033[1mdedupe:\033[m %s\n' >&2 "$2"; exit "$1" ;} die() { printf '\033[1mdedupe:\033[m %s\n' >&2 "$2"; exit "$1" ;}