Практическое задание

Эта задача — шаг 17 курса «Диски, ссылки и свободное место»

Дедупликация: оставь по одной копии

сложно~10 мин

В /srv/docs за годы накопились копии одних и тех же документов под разными именами (в том числе с пробелами и скобками). Оставь по одному файлу на каждое уникальное содержимое, удалив остальные. Имя оставленного файла значения не имеет — важно, чтобы не потерялось ни одно уникальное содержимое.

Что потренируешь:
  • md5sum
  • контрольные суммы
  • awk
  • ассоциативный массив
  • имена с пробелами

Разбор темы

Поиск дубликатов строится на контрольной сумме содержимого: одинаковые данные дают одинаковый хеш независимо от имени, времени и прав файла. Классический конвейер — посчитать суммы, отсортировать, чтобы совпадения оказались рядом, и оставить из каждой группы первую строку. В awk роль «уже видели» играет ассоциативный массив: постфиксный seen[$1]++ возвращает 0 при первом появлении ключа и ненулевое значение дальше, что и отделяет оригинал от копий. Отдельная сложность — имена файлов: md5sum разделяет хеш и имя двумя пробелами, а само имя может содержать пробелы, поэтому разбор по полям ломается, и вырезать нужно фиксированный префикс.

Что проверяется

  1. осталось по одному файлу на содержимое
  2. среди оставшихся нет одинаковых
  3. все варианты содержимого сохранены

Как это выглядит