removeResizedVariants function

void removeResizedVariants(
  1. String dirPath,
  2. List<String> extensions, {
  3. bool dryRun = true,
})

Deletes resized variants like name-108x108.ext for the given extensions, but only when the original name.ext exists.

extensions must be lowercase, without dots (e.g. "jpg","png","webp")

Implementation

void removeResizedVariants(String dirPath, List<String> extensions, {bool dryRun = true}) {
  final dir = Directory(dirPath);
  if (!dir.existsSync()) {
    print('Directory does not exist: $dirPath');
    return;
  }

  final files = dir.listSync().whereType<File>();

  // Normalize extensions
  final allowedExt = extensions.map((e) => e.toLowerCase()).toSet();

  // Regex for resized variants: "<base>-<w>x<h>.<ext>"
  final resizedRegex = RegExp(r'^(.*)-(\d+)x(\d+)\.(\w+)$');

  // Preload filenames
  final existingLower = <String>{};
  for (final f in files) {
    existingLower.add(f.uri.pathSegments.last.toLowerCase());
  }

  for (final file in files) {
    final name = file.uri.pathSegments.last;
    final lower = name.toLowerCase();

    final match = resizedRegex.firstMatch(lower);
    if (match == null) {
      continue;
    }

    final basePart = match.group(1)!;
    final ext = match.group(4)!;

    if (!allowedExt.contains(ext)) {
      continue;
    }

    final originalName = '$basePart.$ext';

    if (existingLower.contains(originalName)) {
      if (dryRun) {
        print('[dryRun] Would delete: $name (original exists: $originalName)');
      } else {
        try {
          file.deleteSync();
          print('Deleted: $name');
        } catch (e) {
          print('Error deleting $name: $e');
        }
      }
    } else {
      print('Skipping $name — original missing: $originalName');
    }
  }
}