Грок код для фотоархива: найти дубликаты и ничего не удалить
Грок код ищут, чтобы нейросеть написала скрипт. Как я получил Python-скрипт, который находит одинаковые файлы по содержимому и ничего не удаляет, и проверил его.
Евгений
Дизайнер-партнёр LibraChat
7 мин чтения
`IMG_2041.jpg`, `IMG_2041 (1).jpg`, `IMG_2041 — копия.jpg`, и ещё одна такая же в папке «Телефон, разобрать». Мой внешний диск за восемь лет работы выглядит именно так. Одна и та же фотография живёт в трёх-четырёх местах, под разными именами, и найти копии глазами невозможно. По запросу «грок код» обычно ищут ровно это: попросить нейросеть написать программу, которая сделает скучную работу. Я попросил LibraChat написать скрипт на Python, который находит одинаковые файлы по содержимому и ничего не удаляет. Ниже три приёма из запроса, проверка на тестовой папке и что я сделал с найденным.
Почему я искал «грок код»
Grok — так называется чат-бот xAI, компании Илона Маска. Запрос «грок код» набирают, когда хотят, чтобы чат написал программу целиком. Я дизайнер, программистом себя не считаю, но время от времени мне нужен маленький инструмент под одну задачу. Здесь задача была простая на словах: найти дубликаты в архиве.
Сначала я пробовал готовые программы для поиска дубликатов. Одна предлагала удалить всё сразу одной кнопкой, и мне стало не по себе. Другая искала по именам, а у меня копии называются по-разному. Третья хотела подписку. Скрипт под себя оказался проще: я сам решаю, что он делает, а чего не делает.
Приём первый: «ничего не удалять, только показать список»
Это главная строка запроса. Вот он целиком:
Напиши скрипт на Python, который находит в папке и во всех её подпапках одинаковые файлы по содержимому, а не по имени, и печатает группы дубликатов с размером каждой группы. Ничего не удалять, только показать список. Только стандартная библиотека. Объясни, как запустить скрипт на Windows, если я раньше Python не запускал.
Фотоархив — это работа за годы. Скрипт, который удаляет сам, может за минуту уничтожить то, что не вернуть. Поэтому первая версия любого моего инструмента для файлов только смотрит. Удалять я буду руками, после того как увижу список.
Ответ это требование выполнил буквально. В начале скрипта комментарий: «Файлы не изменяет и не удаляет». При запуске он печатает то же самое первой строкой. Мелочь, но приятная: инструмент сам напоминает, что он безопасен.
В интерфейсах, которые я рисую, есть старое правило: опасное действие требует подтверждения. Кнопка «Удалить» спрашивает «Точно?». Скрипт без удаления — то же правило, доведённое до конца. Подтверждение здесь не кнопка, а мои руки: каждый лишний файл я удаляю сам, глядя на список. Медленнее, зато я ни разу не пожалел о нажатии.
Приём второй: «по содержимому» и «только стандартная библиотека»
«По содержимому, а не по имени» — вторая важная строка. Копии у меня называются как угодно, имя тут ничего не скажет. Ответ объяснил, как скрипт сравнивает: сначала отсекает файлы разного размера, потом у оставшихся считает отпечаток SHA-256. Два файла с разными именами попадут в одну группу, если их байты совпали. Случайное совпадение отпечатков, по словам ответа, на практике не встречается.
«Только стандартная библиотека» — третья строка. Это значит, что ничего не надо доустанавливать: никаких дополнительных пакетов, только сам Python. Для человека, который запускает Python впервые, каждая лишняя установка — шанс застрять.
Порядок групп тоже продуман: сначала те, где лишние копии занимают больше всего места. Для архива это правильно. Начинаешь с видео и больших файлов, где выигрыш заметен.
Приём третий: инструкция для того, кто не запускал Python
Последняя фраза запроса дала мне пошаговую инструкцию. Самое полезное из неё:
Скачать Python с официального сайта и при установке поставить галочку «Add python.exe to PATH». Без неё команда `python` потом не найдётся.
Сохранить скрипт из Блокнота с типом «Все файлы», иначе Windows допишет `.txt`.
Открыть командную строку через Win+R и `cmd`, перейти в папку со скриптом.
Запустить с путём к папке в кавычках: так не мешают пробелы в названиях.
И две подсказки на случай сбоя. Если `python` не находится, закрыть окно и открыть новое: старое ещё не видит только что установленный Python. Или запустить через `py`. А если русские буквы в путях превратились в кракозябры, перед запуском выполнить `chcp 65001`. У меня папки называются по-русски, и вторая подсказка пригодилась.
Грок код или любой другой: проверка на тестовой папке
Прежде чем натравить скрипт на архив, я собрал тестовую папку. В ней восемь файлов:
одна и та же картинка трижды, под разными именами и в разных подпапках;
два одинаковых документа;
два пустых файла;
картинка того же размера, что первая, но с другим содержимым.
Последний файл — ловушка. Если бы скрипт сравнивал только размер, он записал бы её в копии. Не записал.
Результат совпал с тем, что я заложил. Три группы: три копии картинки, два документа, два пустых файла. Картинка-ловушка ни в одну группу не попала. Внизу итог: сколько места освободится, если в каждой группе оставить по одному файлу. Ни один файл в папке не изменился.
Пустые файлы в отдельной группе меня сначала удивили. Потом я прочитал пояснение в ответе: пустые файлы тоже считаются одинаковыми. Это честно, у них действительно одинаковое содержимое, то есть никакое.
До и после: как я искал копии раньше и как теперь
· Раньше · Теперь
как ищу — сортирую по имени и смотрю глазами — скрипт сравнивает содержимое
копии с другим именем — пропускаю — попадают в группу
файлы одного размера с разным содержимым — путаю — разводит по отпечатку
риск удалить нужное — высокий, решаю на глаз — список перед глазами, удаляю руками
сколько места займут копии — не знаю — итог внизу отчёта
Первую папку, «Телефон, разобрать», я разобрал по списку за 30 минут. Раньше на одну папку уходил вечер. Теперь скрипт работает сам, а я трачу время только на решение, что оставить. На большой папке с видео он работает дольше, как и предупреждал ответ: каждый подозрительный файл он читает целиком.
Копии с телефона: что делать с найденными группами
Больше всего копий у меня оказалось в папках, куда я сбрасывал снимки с телефона. Каждый импорт создавал новую пачку тех же фотографий. Решение, что оставить, я принимаю как дизайнер, по месту:
оригинал оставляю там, где он лежит в проекте или в архиве по годам;
копии в папках «разобрать» и «с телефона» удаляю первыми;
если копия лежит в папке клиента, не трогаю, даже если она лишняя.
Удаляю я группами, сверху вниз: сначала крупные видео, потом фотографии. Каждую группу открываю в проводнике и смотрю на путь, а не на картинку. По пути сразу видно, где оригинал, а где случайная копия после импорта.
Последнее правило я вывел на собственном опыте. Однажды я удалил «лишнюю» копию из папки клиента, а потом выяснилось, что именно эту папку я отправлял ему ссылкой. Ссылка сломалась. Теперь клиентские папки неприкосновенны.
Где грок код не заменит осторожность
Скрипт показывает, что файлы одинаковые. Он не знает, какая копия нужна. Это решение остаётся за человеком, и хорошо, что я попросил скрипт ничего не удалять.
Второе. Перед любой чисткой архива я делаю резервную копию. Даже если удаляю руками. Ошибиться можно и самому.
И третье. Код из чата стоит проверить на маленькой тестовой папке, прежде чем запускать на настоящих данных. Это 5 минут, и это правило я применяю к любому скрипту, кто бы его ни написал. Красный текст в командной строке пугает только первый раз: его можно целиком скопировать в тот же разговор и попросить разобраться, что пошло не так.
Как нейросеть помогает фотографам не только с файлами, но и со съёмкой и обработкой, есть статья нейросеть для фотографа.
Посмотри на свой архив
Попробуй прямо сейчас: открой чат LibraChat, скопируй этот промпт и отправь его без изменений. Собери тестовую папку из восьми файлов, как у меня, и запусти скрипт сначала на ней. Если три группы совпадут с тем, что ты заложил, запускай на архиве и смотри на список. Удалять или нет, решишь сам. Что ещё входит в подписки, видно на странице тарифов.
грок кодpythonдубликаты файловфотоархивскриптпорядок в файлах