Вопрос или проблема
У меня есть очень большая фотобиблиотека, охватывающая более 10 лет, управляемая программой Shotwell. Недавно я заметил, что моя файловая система показывает намного больше файлов за 2024 год, чем Shotwell:
find -iname "*.jpg" -exec echo 1 \; | wc -l
сообщает о 7681 файле- Shotwell, при помощи Ctrl-A на всех событиях, сообщает о 3505 фотографиях и 20 фильмах
Я хотел бы избавиться от всех фотографий, не отслеживаемых Shotwell. В идеале было бы хорошо получить сначала их имена, но просто удалить их тоже было бы неплохо. Есть ли способ сделать это?
Я не смог найти способ сделать это из интерфейса Shotwell. Поэтому я использовал sqlite
, чтобы извлечь пути ко всем файлам, известным Shotwell.
Важно: Shotwell сохраняет данные о видео и фотографиях в разных таблицах. Необходимо делать запросы к обоим, иначе важные файлы будут предположительно неизвестны Shotwell!
Выполнение следующих двух команд создало файл со всеми фотографиями и видео, известными Shotwell. Обратите внимание на >>
во второй команде, используемой для добавления вывода.
sqlite3 ~/.local/share/shotwell/data/photo.db "SELECT DISTINCT filename FROM PhotoTable;" | sort > ~/files-known-by-shotwell
sqlite3 ~/.local/share/shotwell/data/photo.db "SELECT DISTINCT filename FROM VideoTable;" | sort >> ~/files-known-by-shotwell
Список всех файлов в папке с изображениями можно получить, например, используя fd: fd . --type f ~/Images > ~/all-files
Возможно, потребуется немного обработки обоих файлов, чтобы адаптировать имена файлов друг к другу, например, сделать все пути абсолютными или относительными. После этого оба файла необходимо отсортировать с помощью команды sort
И, наконец, инструмент comm
(ссылка) можно использовать для поиска файлов, доступных, но неизвестных для Shotwell: comm -23 ~/all-files ~/files-known-by-shotwell
.
Ответ или решение
Перед вами стоит задача очистки вашей библиотеке фотографий, управляемой через Shotwell, от файлов, которые не отслеживаются этой программой. В соответствии с вашим описанием возникает проблема диссонанса между количеством файлов, подсчитанных в файловой системе, и количеством файлов, которые отображает Shotwell. Можно определить и удалить все фотографии, которые не отслеживаются Shotwell в несколько этапов, используя базы данных Shotwell и командную строку Unix/Linux.
Теория
Shotwell управляет мультимедийными файлами (фотографиями и видео) и хранит информацию о них в базе данных SQLite. Эти данные включают пути к файлам, которые добавлены в библиотеку Shotwell. Однако ситуация может возникнуть, когда в файловой системе остаются фотографии, которые были удалены или никогда не были добавлены в Shotwell, что объясняет расхождение в числах между файловой системой и Shotwell.
Для решения проблемы мы предлагаем использовать утилиту sqlite3
для вытаскивания списка файлов, управляемых Shotwell, и базовые командные утилиты Unix для сравнительного анализа и удаления дубликатов. Важно обратить внимание, что Shotwell для хранения данных о фото и видео использует разные таблицы, поэтому нужно следить за тем, чтобы изъять информацию из обеих.
Пример
Процесс поиска и удаления неотслеживаемых файлов можно разделить на следующие этапы:
1. Извлечение имен файлов из Shotwell:
Используя утилиту sqlite3
, вы можете извлечь пути к фотографиям и видео, сохраненным в Shotwell, командой:
sqlite3 ~/.local/share/shotwell/data/photo.db "SELECT DISTINCT filename FROM PhotoTable;" | sort > ~/files-known-by-shotwell
sqlite3 ~/.local/share/shotwell/data/photo.db "SELECT DISTINCT filename FROM VideoTable;" | sort >> ~/files-known-by-shotwell
2. Создание списка всех файлов в вашей папке изображений:
Вы можете использовать инструмент fd
или find
для генерации списка всех файлов в папке изображений:
fd . --type f ~/Images > ~/all-files
или
find ~/Images -type f > ~/all-files
3. Подготовка списка к анализу:
Оба файла (~/files-known-by-shotwell
и ~/all-files
) должны быть отсортированы, чтобы использовать утилиту comm
, которая позволяет найти разницу между двумя файлами. Найдите файлы, которые существуют в файловой системе, но не отслеживаются Shotwell:
sort ~/all-files | comm -23 - ~/files-known-by-shotwell
Данная команда выведет список файлов, которые существуют в вашей системе, но отсутствуют в базе данных Shotwell.
4. Удаление неотслеживаемых фотографий:
Файлы, не отслеживаемые Shotwell, можно удалить, используя следующую команду:
comm -23 ~/all-files ~/files-known-by-shotwell | xargs rm
Этот шаг удалит все файлы, которые не находятся в Shotwell, оставляя вашу папку изображений синхронизированной с библиотекой Shotwell.
Применение
Использование этого процесса позволяет вам надежно и систематически очищать вашу библиотеку изображений. Это особенно актуально для больших и длительных периодов накопления мультимедиа, предотвращая захламление. Совместное использование SQL-запросов и команд Unix дает возможность оптимизировать управление файлами, снижая риск потери важных данных, известных Shotwell, и удаляя ненужные файлы. Данный подход не только освободит место на диске, но и обеспечит структуру вашей библиотеки, упрощая навигацию и последующее управление вашими фотографиями и видео.
В заключение, помимо поддержания порядка и освобождения места на диске, этот процесс также улучшает производительность вашего рабочего пространства и потенциально сокращает время отклика приложений, которые могут быть перегружены ненужными файлами. Успешное выполнение описанных шагов сделает вашу мультимедийную библиотеку более управляемой и эффективной в долгосрочной перспективе.