Сложной частью этого является сканирование каталога только потому, что он может быть дорогим.
Но это жестокая реальность, поскольку вы не можете использовать inotify и др.
Вв вашей базе данных просто создайте запись типа узла:
create table node (
nodeKey integer not null primary key,
parentNode integer references node(nodeKey), // allow null for the root, or have root point to itself, whatever
fullPathName varchar(2048),
nodeName varchar(2048),
nodeType varchar(1) // d = directory, f = file, or whatever else you want
)
Это структура вашего узла.
Вы можете использовать столбец полного пути, чтобы быстро найти что-либо по абсолютному пути.
Когда файл перемещается, просто пересчитайте путь.
Наконец, просканируйте свои музыкальные файлы.В Unix вы можете сделать что-то вроде:
find.тип F |sort> sortedListOfFiles
Далее просто высосите все пути из базы данных.
выберите fullPathName из узла, где nodeType! = 'd', упорядочьте по fullPathName
сейчасу вас есть два отсортированных списка файлов.
Запустите их через DIFF (или comm), и вы получите список удаленных и новых файлов.У вас не будет списка «перемещенных» файлов.Если вы хотите провести эвристический анализ, сравнивая новые и старые файлы с одинаковыми окончаниями (т. Е. .... / альбом / песня), чтобы попытаться обнаружить «ходы» по сравнению с новым и старым, тогда ничего страшного.Стоит попробовать.
Но diff даст вам ваш дифференциал в одно мгновение.
Если у вас есть миллионы файлов, тогда, извините, это займет некоторое время - но вы ужеЗнайте, что когда вы потеряете способность inotify.Если бы у вас было это, это было бы просто добавочным обслуживанием.
Когда файл перемещается, тривиально найти его новый абсолютный путь, потому что вы можете запросить у его родителя его путь и просто добавить к нему свое имя.После этого вы не ползаете по дереву или что-то еще, если только не хотите.Работает в обоих направлениях.
Дополнения:
Если вы хотите отслеживать фактические изменения имени, вы можете получить немного больше информации.
Вы можете сделать это:
find . -type f -print0 | xargs -0 ls -i | sort -n > sortedListOfFileWithInode
-print0 и -0 используются для работы с файлами с пробелами в них.Кавычки в именах файлов разрушат это однако.Возможно, вам лучше запустить необработанный список через python и fstat, чтобы получить индекс.Здесь вы можете делать разные вещи.
Вместо того, чтобы просто иметь имена, вы также получаете индекс файла.Inode - это «настоящий» файл, каталог связывает имена с inode.Таким образом, вы можете иметь несколько имен (жестких ссылок) в файловой системе Unix на один файл, все имена указывают на один и тот же индекс.
Когда файл переименовывается, индекс остается неизменным.,В Unix есть единственная команда, используемая для переименования и перемещения файлов, mv.Когда mv переименовывает или перемещает файл, индекс остается таким же длинным, как и файл в той же системе файлов.
Таким образом, использование индекса и имени файла позволит вам получить более интересную информацию, как файл перемещается.
Это не поможет, если они удалят файл и добавят новый файл.Но вы (вероятно) сможете сказать, что это произошло, поскольку маловероятно, что старый индекс будет повторно использован для нового индекса.
Так что если у вас есть список файлов (отсортированный по имени файла):
1234 song1.mp3
1235 song2.mp3
1236 song3.mp3
и кто-то удаляет и добавляет обратно песню 2, у вас будет что-то вроде
1234 song1.mp3
1237 song2.mp3
1236 song3.mp3
Но если вы сделаете это:
mv song1.mp3 song4.mp3
ВыВы получите:
1237 song2.mp3
1236 song3.mp3
1234 song4.mp3
Другое предостережение: если вы потеряете диск и восстановите его из резервной копии, скорее всего, все inode будут изменены, что фактически приведет к перестройке индекса.
Если вы действительно любите приключения, вы можете попробовать поиграть с расширенными атрибутами файловой системы и назначить другим интересным метаданным файлы.Многое с этим не сделано, но у него тоже есть возможности, и, скорее всего, есть невидимые опасности, но ...