扫描目录、生成清单、算 SHA-256、支持 --dry-run。代码不长,但每行都有理由。