Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637#!/usr/bin/env zshemulate -L zshexport LC_ALL=CSRC="/Volumes/MicroSD-512"DST="/Volumes/photos library iCloud"AUDIT="$HOME/msd512-audit"SM="$AUDIT/src.manifest.tsv"[[ -s "$SM" ]] || { print "FATAL: missing $SM"; exit 1; }
# 1. seed mapping.tsv with the decided proposals (operator may edit)if [[ ! -s "$AUDIT/mapping.tsv" ]]; then { printf 'src_subpath\tdst_subpath\taction\tnote\n' printf 'Jellyfin/Movie\tMedia/Jellyfin/Movie\tMIGRATE\tjellyfin movies\n' printf 'Jellyfin/TV\tMedia/Jellyfin/TV\tMIGRATE\tjellyfin tv\n' printf 'archive/z-New folder\tArchive/z-New folder\tMIGRATE\t87GB largest bucket\n' printf 'archive/Twitch\tArchive/Twitch\tMIGRATE\tsmall\n' printf 'QBT/0-torrents\tQBT/0-torrents\tMIGRATE\ttorrent files\n' } > "$AUDIT/mapping.tsv" print "[*] seeded $AUDIT/mapping.tsv - EDIT IT NOW, then re-run this script"fi
# 2. report any SRC top-2 dir not covered by mapping.tsvawk -F'\t' -v R="$SRC" 'NR==FNR{if(FNR>1)m[$1]=1;next} {rel=substr($3,length(R)+2); n=split(rel,a,"/"); d=(n>=3)?a[1]"/"a[2]:((n==2)?a[1]:"(root-files)"); if(!(d in m)){c[d]++; b[d]+=$2}} END{for(k in c) printf "UNMAPPED\t%d\t%.2f GB\t%s\n", c[k], b[k]/1e9, k}' "$AUDIT/mapping.tsv" "$SM" | sort -k2 -nr > "$AUDIT/unmapped.tsv"
# 3. build the work list: exclude junk, apply mapping, emit src<TAB>dst<TAB>sizeawk -F'\t' -v R="$SRC" -v D="$DST" 'NR==FNR{if(FNR>1){k[$1]=$2; act[$1]=$3} next} {p=$3; rel=substr(p,length(R)+2); n=split(rel,q,"/"); f=q[n]; if(substr(f,1,2)=="._"){print "SKIPPED\t\t"$2"\t"p"\t\tappledouble" > "/dev/stderr"; next} if(f==".DS_Store"||tolower(f)=="thumbs.db"){print "SKIPPED\t\t"$2"\t"p"\t\tjunk" > "/dev/stderr"; next} d2=(n>=3)?q[1]"/"q[2]:((n==2)?q[1]:""); d1=q[1]; key=(d2 in k)?d2:((d1 in k)?d1:""); if(key==""){print "SKIPPED\t\t"$2"\t"p"\t\tunmapped" > "/dev/stderr"; next} if(act[key]!="MIGRATE"){print "SKIPPED\t\t"$2"\t"p"\t\taction="act[key] > "/dev/stderr"; next} sub("^"key"/","",rel); printf "%s\t%s/%s/%s\t%d\n", p, D, k[key], rel, $2}' "$AUDIT/mapping.tsv" "$SM" > "$AUDIT/worklist.tsv" 2>> "$AUDIT/ledger.tsv"
# 4. size-ordered variant is FORBIDDEN; keep SRC directory order for locality.awk -F'\t' '{n++; b+=$3} END{printf "worklist: %d files, %.1f GiB\n", n, b/1073741824}' "$AUDIT/worklist.tsv" > "$AUDIT/worklist.summary.txt"
print "===== MAPPING ====="; cat "$AUDIT/mapping.tsv"print "===== UNMAPPED (needs a decision) ====="; cat "$AUDIT/unmapped.tsv"print "===== WORKLIST ====="; cat "$AUDIT/worklist.summary.txt"print "===== SKIPPED BREAKDOWN ====="; awk -F'\t' '$1=="SKIPPED"{c[$6]++} END{for(k in c) printf "%d\t%s\n", c[k], k}' "$AUDIT/ledger.tsv" | sort -nrprint "===== SAMPLE MAPPINGS ====="; head -3 "$AUDIT/worklist.tsv" | cut -f1,2