Najtrudniejszą częścią jest skanowanie katalogu, tylko dlatego, że może być kosztowne.
Ale to jest okrutna rzeczywistość, ponieważ nie można używać inotify et al.
W swojej bazie danych, wystarczy utworzyć rekord typu węzła:
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
)
To twoja budowa węzła.
Możesz użyć kolumny pełnej ścieżki, aby szybko znaleźć wszystko według bezwzględnej ścieżki.
Gdy plik się rusza, po prostu przelicz ponownie ścieżkę.
Na koniec zeskanuj pliki muzyczne. W systemie Unix możesz zrobić coś takiego:
znaleźć. -type f | sort> sortedListOfFiles
Następnie, po prostu wysysaj wszystkie nazwy ścieżek z bazy danych.
wybierz fullPathName od węzła gdzie = 'd' zamów przez fullPathName
nodeType! Teraz masz dwa posortowaną listę plików.
Przeprowadź je przez DIFF (lub comm), a otrzymasz listę usuniętych i nowych plików. Nie będziesz mieć listy "przeniesionych" plików. Jeśli chcesz przeprowadzić heurystykę w przypadku porównywania nowych i starych plików i mają one te same zakończenia (tzn. ..../album/utwór), aby spróbować wykryć "ruchy" w stosunku do nowych i starych, to dobrze, nic wielkiego. Warto strzelić.
Ale diff da ci różnicę w mgnieniu oka.
Jeśli masz ziliony plików, to przepraszam, to zajmie trochę czasu - ale już wiesz, że kiedy stracisz możliwość inotify. Gdyby tak było, byłaby to tylko przyrostowa konserwacja.
Gdy plik się porusza, znalezienie nowego bezwzględnego ścieżki jest banalne, ponieważ możesz poprosić rodzica o ścieżkę i po prostu dołączyć do niego swoje imię. Potem nie indeksujesz drzewa ani niczego, chyba że chcesz. Działa w obie strony.
Addenda:
Jeśli chcesz śledzić rzeczywiste zmiany nazwy, można uzyskać trochę więcej informacji.
Można to zrobić:
find . -type f -print0 | xargs -0 ls -i | sort -n > sortedListOfFileWithInode
-print0 i -0 służą do pracy z plikami ze spacjami w nich. Cytaty w nazwach plików zniszczą to jednak. Lepszym rozwiązaniem może być uruchamianie surowej listy przez pythona i fstat, aby uzyskać i-węzeł. Różne rzeczy, które możesz tutaj zrobić.
To, co to robi, a nie tylko posiadanie imion, również dostanie i-węzeł pliku. I-węzeł jest "prawdziwym" plikiem, katalog łączy nazwy z i-węzłami. W ten sposób można mieć wiele nazw (twarde linki) w systemie plików unix do jednego pliku, wszystkie nazwy wskazują na ten sam i-węzeł.
Po zmianie nazwy pliku, i-węzeł pozostanie bez zmian. W unixie jest jedno polecenie używane do zmiany nazwy i przenoszenia plików, mv. Kiedy mv zmieni nazwę lub przeniesie plik, i-węzeł pozostanie niezmieniony, ZGODNIE Z PLIKIEM JEST W TYM SAMYM SYSTEMIE PLIKÓW.
Używanie i-węzła oraz nazwy pliku pozwoli ci uchwycić trochę bardziej interesujących informacji, takich jak ruchy plików.
Nie pomoże, jeśli usunie plik i doda nowy plik. Ale BĘDZIESZ (prawdopodobnie) będziesz w stanie powiedzieć, że to się stało, ponieważ jest mało prawdopodobne, aby stary i-węzeł został ponownie użyty dla nowego i-węzła.
Więc jeśli masz listę plików (sortowane według nazwy pliku):
1234 song1.mp3
1235 song2.mp3
1236 song3.mp3
i ktoś usuwa i dodaje z powrotem piosenkę 2, będziesz miał coś podobnego
1234 song1.mp3
1237 song2.mp3
1236 song3.mp3
ale jeśli
mv song1.mp3 song4.mp3
Dostaniesz::
to zrobić
1237 song2.mp3
1236 song3.mp3
1234 song4.mp3
Innym zastrzeżeniem jest to, że w przypadku utraty dysku i przywrócenia go z kopii zapasowej, prawdopodobne jest, że wszystkie i-węzły ulegną zmianie, skutecznie wymuszając przebudowę indeksu.
Jeśli jesteś prawdziwym poszukiwaczem przygód, możesz spróbować grać z rozszerzonymi atrybutami systemu plików i przypisać inne ciekawe meta dane do plików. Nie zrobiłem z tym większego problemu, ale są również możliwości, i są prawdopodobnie niewidoczne niebezpieczeństwa, ale ...
Dlaczego oryginalny pomysł przez O (n^2)? Zakładając, że baza danych ma indeks O (log n) na nazwie utworu (który powinien być łatwy do ustawienia), powinien to być O (n log n). – andrewdski
Jeśli martwisz się złożonością, możesz użyć skrótu 'O (n)' dla 'n' wyszukiwania/aktualizacji. –
Po drugie, pomysł mieszania; jedynym problemem jest to, w jaki sposób decydujesz o unikalnym kluczu do mieszania? Nie podałbym żadnych normalnych atrybutów plików, bo te mogą się zmienić. Może zrobić klucz na podstawie próbek z pliku? –