Kategorie zamiast katalogów, czyli semantyczny system plików dla Linuksa

Klasyfikacja danych to sama w sobie interesujący temat badań. Lubię kolekcjonować informacje, które wydają się potrzebne, i zawsze starałem się tworzyć logiczne hierarchie katalogów dla swoich plików. Pewnej nocy miałem sen o pięknym i wygodnym programie do przypisywania tagów plikom, postanowiłem, że nie mogę dłużej tak żyć.

Problem hierarchicznych systemów plików

Użytkownicy często napotykają problem wyboru miejsca na zapisanie kolejnego nowego pliku oraz problem poszukiwania własnych plików (czasami nazwy plików w ogóle nie są przystosowane do zapamiętania przez człowieka).

Rozwiązaniem mogą być semantyczne systemy plików, które zazwyczaj są nakładką na tradycyjny system plików. Katalogi w nich zastępowane są atrybutami semantycznymi, znanymi także jako tagi, kategorie, metadane. Częściej będę używał terminu „kategoria”, ponieważ w kontekście systemów plików słowo „tag” brzmi czasem dziwnie, szczególnie gdy zaczynają pojawiać się „podtagi” i „aliasy tagów”.

Przypisanie kategorii plikom w dużej mierze eliminuje problemy z miejscem przechowywania i wyszukiwaniem pliku: jeśli pamiętasz (lub przypuszczasz) chociaż jedną z przypisanych do pliku kategorii, plik nigdy nie zniknie z pola widzenia.

Wcześniej na Habrze niejednokrotnie poruszano ten temat (raz, dwa, trzy, cztery i inni), tutaj opisuję swoje rozwiązanie.

Droga do realizacji

Tuż po wspomnianym śnie opisałem w zeszycie interfejs wiersza poleceń, który zapewniałby niezbędną pracę z kategoriami. Zdecydowałem wtedy, że w ciągu tygodnia lub dwóch mogę napisać prototyp, używając Pythona lub Basha, a potem trzeba będzie przeprowadzić prace nad stworzeniem graficznego interfejsu w Qt lub GTK. Rzeczywistość, jak zawsze, okazała się znacznie surowsza, a rozwój się przedłużył.

Początkowy pomysł polegał na tym, aby przede wszystkim stworzyć program z wygodnym i zwięzłym interfejsem wiersza poleceń, który będzie tworzyć, usuwać kategorie, przypisywać kategorie plikom i usuwać kategorie z plików. Program nazwałem vitis.

Pierwsza próba stworzenia vitis Nie zakończyło się niczym, ponieważ dużo czasu zaczęło mi umykać na pracę i studia. Drugie podejście było już czymś: udało mi się zakończyć planowany projekt na magisterkę i nawet stworzyć prototyp powłoki GTK. Ale ta wersja okazała się tak mało niezawodna i niewygodna, że musiałem wiele rzeczy przemyśleć na nowo.

W trzeciej wersji korzystałem sam przez długi czas, przypisując do kategorii kilka tysięcy swoich plików. W tym pomogło w dużej mierze wdrożone autouzupełnianie bash. Niemniej jednak niektóre problemy, takie jak brak automatycznych kategorii i możliwość przechowywania plików o tej samej nazwie, wciąż pozostawały, a program zaczynał się dusić pod własną złożonością. Tak doszedłem do konieczności rozwiązywania problemów związanych z rozwojem skomplikowanego oprogramowania: spisanie szczegółowych wymagań, opracowanie systemu testowania funkcjonalnego, studiowanie instrukcji dotyczących pakowania i wiele innych. Teraz udało mi się osiągnąć zamierzony cel, więc to skromne dzieło może być przedstawione wolnej społeczności. Tak specyficzne zarządzanie plikami, jak zarządzanie poprzez koncepcję kategorii, porusza niespodziewane pytania i problemy, a ich rozwiązywanie. vitis spowodował wokół siebie jeszcze pięć projektów, z niektórymi z nich zostaną omówione w artykule. Do dziś vitis nie zdobyłem graficznego interfejsu, ale wygoda korzystania z kategorii plików z poziomu wiersza poleceń już przewyższa dla mnie wszelkie zalety zwykłego graficznego menedżera plików.

Przykłady użycia

Zacznijmy od prostego — stwórzmy kategorię:

vitis create Muzyka

Dodajmy do niej dla przykładu jakąś kompozycję:

vitis assign Muzyka -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"

Zawartość kategorii „Muzyka” można zobaczyć za pomocą podkomendy „show”:

vitis show Muzyka

Aby ją odtworzyć, można użyć podkomendy „open”

vitis open Muzyka

Ponieważ w kategorii „Muzyka” mamy tylko jeden plik, zostanie uruchomiony tylko on. W celu otwierania plików w domyślnych programach stworzyłem osobne narzędzie vts-fs-open (standardowe narzędzia typu xdg-open lub mimeopen nie spełniały moich oczekiwań z różnych powodów; ale jeśli coś, w ustawieniach możesz wskazać inne narzędzie do ogólnego otwierania plików). To narzędzie dobrze działa na różnych dystrybucjach z różnymi środowiskami graficznymi, więc polecam zainstalować je razem z vitis.

Można również bezpośrednio wskazać program do otwierania plików:

vitis open Muzyka --app qmmp

Kategorie zamiast katalogów, czyli semantyczny system plików dla Linuksa

Stworzymy jeszcze kilka kategorii i dodamy pliki za pomocą „assign”. Jeśli pliki przypisywane są do nieistniejących kategorii, wyświetli się prośba o ich utworzenie. Można uniknąć zbędnej prośby, stosując flagę —yes.

vitis assign Programowanie R -f "Wprowadzenie do R.pdf" "Pakiet statystyczny R: teoria prawdopodobieństwa i matstatystyka.pdf" --yes

Teraz chcemy dodać plikowi „Pakiet statystyczny R: teoria prawdopodobieństwa i matstatystyka.pdf” kategorię „Matematyka”. Wiemy, że ten plik już ma kategorię „R”, dlatego możemy wykorzystać ścieżkę kategorii z systemu Vitis:

vitis assign Matematyka -v "R/Pakiet statystyczny R: teoria prawdopodobieństwa i matstatystyka.pdf"

Na szczęście autouzupełnianie bash pozwoli to zrobić łatwo.

Zobaczmy, co się udało, używając flagi —categories, aby zobaczyć listę kategorii dla każdego pliku:

vitis show R --categories

Kategorie zamiast katalogów, czyli semantyczny system plików dla Linuksa

Zauważ, że plikom przypisano również automatyczne kategorie według formatu, typu (łączenie formatów) i rozszerzenia plików. Te kategorie można w razie potrzeby wyłączyć. W późniejszym czasie na pewno zrobię lokalizację ich nazw.

Dodajmy dla różnorodności jeszcze coś do „Matematyki”:

vitis assign Matematyka -f "Analiza matematyczna - 1984.pdf" Perelman_Zajmująca_matematyka_1927.djvu 

A teraz zaczyna się coś interesującego. Zamiast kategorii można pisać wyrażenia z operacjami łączenia, przecięcia i różnicowania, to znaczy korzystać z operacji na zbiorach. Na przykład, przecięcie „Matematyki” z „R” da w wyniku jeden plik.

vitis show R i: Matematyka

Odejmujemy z „Matematyki” wzmianki o języku „R”:

vitis show Matematyka R #lub vitis show Matematyka c: R

Możemy bez celu połączyć muzykę i język R:

vitis show Muzyka u: R

Flaga -n pozwala na „wyciąganie” z wyniku zapytania odpowiednich plików według numerów i/lub zakresów, na przykład, -n 3-7, lub coś bardziej skomplikowanego: -n 1,5,8-10,13. Często jest to przydatne z podkomendą open, która pozwala otwierać odpowiednie pliki z listy.

Kategorie zamiast katalogów, czyli semantyczny system plików dla Linuksa

Chociaż odstępujemy od korzystania z tradycyjnej hierarchii katalogów, często jest przydatne posiadanie zagnieżdżonych kategorii. Stworzymy podkategorię „Statystyka” w kategorii „Matematyka” i dodamy tę kategorię do odpowiedniego pliku:

vitis create Matematyka/Statystyka

vitis assign Matematyka/Statystyka -v "R/Wprowadzenie do R.pdf"

vitis show Matematyka --categories

Kategorie zamiast katalogów, czyli semantyczny system plików dla Linuksa

Możemy zauważyć, że ten plik ma teraz kategorię „Matematyka/Statystyka” zamiast „Matematyka” (niepotrzebne linki są śledzone).

Zwracanie się do pełnej ścieżki może być niewygodne, więc stwórzmy „globalny” alias:

vitis assign Matematyka/Statystyka -a Statystyka

vitis show Statystyka

Kategorie zamiast katalogów, czyli semantyczny system plików dla Linuksa

Nie tylko zwykłe pliki

Linki internetowe

Dla ujednolicenia przechowywania wszelkich informacji byłoby pomocne, co najmniej, kategoryzowanie linków do zasobów internetowych. I to jest możliwe:

vitis assign Habr KolorAnomalia -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes

W specjalnym miejscu zostanie utworzony plik z tytułem strony HTML i rozszerzeniem .desktop. To tradycyjny format skrótu w GNU/Linux. Takie skróty automatycznie otrzymują kategorię NetworkBookmarks.

Naturalnie, skróty są tworzone, aby z nich korzystać:

vitis open KolorAnomalia

Wykonanie polecenia prowadzi do otwarcia w przeglądarce właśnie zapisanej strony. Kategorii linków do źródeł internetowych mogą służyć jako zamiennik zakładek w przeglądarce.

Fragmenty plików

Również korzystne jest posiadanie kategorii dla poszczególnych fragmentów plików. Nieźle, prawda? Ale obecna implementacja dotyczy tylko zwykłych plików tekstowych, audio i wideo. Powiedzmy, że musisz zaznaczyć określoną część jakiegoś koncertu lub zabawny moment w filmie, wtedy przy użyciu assign możesz skorzystać z flag —fragname, —start, —finish. Zapiszmy czołówkę z „Kaczych Opowieści”:

vitis assign vitis assign -c Czołówki -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Czołówka Kaczych Opowieści"

vitis open Czołówki

Tak naprawdę nie zachodzi żadne wycinanie plików, zamiast tego tworzy się plik-wskaźnik na fragment, w którym opisany jest typ pliku, ścieżka do pliku, początek i koniec fragmentu. Tworzenie i otwieranie wskaźników na fragmenty jest delegowane do narzędzi, które specjalnie stworzyłem w tym celu — to mediafragmenter i fragplayer. Pierwsze tworzy, drugie otwiera. W przypadku nagrań audio i wideo uruchomienie pliku multimedialnego od określonej pozycji do określonej pozycji odbywa się za pomocą odtwarzacza VLC, więc on także musi być w systemie. Najpierw chciałem to zrobić na podstawie mplayer’a, ale tam jakoś bardzo krzywo działało z pozycjonowaniem w odpowiednim momencie.
W naszym przykładzie tworzy się plik „Duck Tales intro.fragpointer” (umieszczany jest w specjalnym miejscu), a następnie odtwarzany jest fragment od początku pliku (ponieważ —start nie został podany podczas tworzenia) do oznaczenia w 59 sekundzie, po czym VLC się zamyka.

Inny przykład — postanowiliśmy skategoryzować wystąpienie na koncercie jakiegoś znanego wykonawcy:

vitis assign Lepc "Spasite nashi dushi" -f Grigorij Lepc - Koncert Parus - piosenki Władimira Wysockiego.mp4 --fragname "Spasite nashi dushi" --start 00:32:18 --finish 00:36:51

vitis open "Spasite nashi dushi"

Po otwarciu plik zostanie włączony w odpowiedniej pozycji i zamknie się po czterech i pół minutach.

Jak to wszystko działa + dodatkowe możliwości

Przechowywanie kategorii

Na początku planowania organizacji semantycznego systemu plików wpadłem na trzy sposoby: przez przechowywanie symbolicznych linków, za pomocą bazy danych, przez opis w XML. Wygrał pierwszy sposób, ponieważ z jednej strony jest prosty w realizacji, a z drugiej — użytkownik ma możliwość przeglądania kategorii bezpośrednio z systemu plików (co jest wygodne i ważne). Na początku użytkowania vitis w katalogu domowym użytkownika tworzony jest katalog „Vitis” oraz plik konfiguracyjny „.config/vitis/vitis.conf”. W ~ /Vitis tworzone są katalogi odpowiadające kategoriom, a w tych katalogach-kategoriach tworzone są symboliczne linki do oryginalnych plików. Alias kategorii to również po prostu linki do nich. Oczywiście posiadanie katalogu „Vitis” w katalogu domowym może niektórym przeszkadzać. Możemy przełączyć się w dowolne inne miejsce:

vitis service set path /mnt/MyFavoriteDisk/Vitis/

W pewnym momencie staje się jasne, że rozproszone pliki w różnych miejscach mało sensownie jest kategoryzować, ponieważ ich lokalizacja może się zmieniać. Dlatego na początek stworzyłem sobie katalog, do którego po prostu wrzucałem wszystko i nadawałem temu wszystkim kategorie. Potem postanowiłem, że dobrze by było sformalizować ten moment na poziomie programowym. Tak powstała koncepcja „przestrzeni plikowej”. Na początku użytkowania vitis od razu nie zaszkodziłoby skonfigurować takie miejsce (tam będą gromadzone wszystkie potrzebne nam pliki) i włączyć automatyczne zapisywanie:

vitis service add filespace /mnt/MyFavoriteDisk/Filespace/

vitis service set autosave yes

Bez automatycznego zapisywania przy użyciu podkomendy „assign” konieczne będzie użycie flagi —save, jeśli zajdzie potrzeba zapisania dodawanego pliku w przestrzeni plikowej.

Co więcej, można dodać kilka przestrzeni plikowych i zmieniać ich priorytety, co może być przydatne, gdy jest dużo plików przechowywanych na różnych nośnikach. Nie będę tutaj omawiać tej funkcjonalności, szczegóły można znaleźć w dokumentacji programu.

Migracja semantycznego systemu plików

Tak czy inaczej, katalog Vitis i przestrzenie plikowe teoretycznie mogą czasem przenosić się z miejsca na miejsce. Aby przywrócić działanie, stworzyłem osobne narzędzie link-editor, które może masowo edytować linki, zastępując części ścieżki innymi:

cp -r /mnt/MyFavoriteDisk/Vitis/ ~/Vitis
link-editor -d ~/Vitis/ -f /mnt/MyFavoriteDisk/Vitis/ -r ~/Vitis/ -R
cp -r /mnt/MyFavoriteDisk/Filespace/ ~/MyFiles
link-editor -d ~/Vitis/ -f /mnt/FlashDrive-256/Filespace/ -r ~/MyFiles -R

W pierwszym przypadku, po przeniesieniu z /mnt/MyFavoriteDisk/Vitis/ do katalogu domowego, edytowane są linki symboliczne związane z aliasami. W drugim przypadku, po zmianie lokalizacji przestrzeni plikowej, wszystkie linki w Vitis są zmieniane na nowe zgodnie z zapytaniem o zastąpienie części ich ścieżki.

Automatyczne kategorie

Jeśli uruchomisz polecenie vitis service get autocategorization, możesz zobaczyć, że domyślnie skonfigurowane jest przypisanie automatycznych kategorii na podstawie formatu (Format i Typ) oraz rozszerzenia plików (Rozszerzenie).

Jest to przydatne, gdy na przykład musisz znaleźć coś wśród plików PDF lub sprawdzić, co przechowujesz w formatach EPUB i FB2; wystarczy wykonać zapytanie

vitis show Format/MOBI u: Format/FB2

Okazało się, że standardowe narzędzia GNU/Linux, takie jak file czy mimetype, nie spełniły moich oczekiwań, ponieważ nie zawsze prawidłowo identyfikują format plików, więc musiałem stworzyć własną implementację opartą na sygnaturach plików i rozszerzeniach. W ogóle, temat określania formatów plików jest interesujący i zasługuje na osobny artykuł. Na razie mogę powiedzieć, że być może nie dla wszystkich formatów na świecie przewidziałem prawidłowe rozpoznawanie, ale ogólnie już teraz działa to całkiem nieźle. Niestety, aktualnie format EPUB identyfikowany jest jako ZIP (co jest, w sumie, uzasadnione, ale w praktyce nie należy tego uważać za normalne zachowanie). Do pewnego stopnia proszę traktować tę funkcjonalność jako eksperymentalną, a o błędach informować. W dziwnych sytuacjach zawsze można korzystać z kategorii według rozszerzenia pliku, na przykład Extension/epub.

Jeśli są włączone automatyczne kategorie według formatu, są również włączone automatyczne kategorie łączące niektóre formaty, takie jak: „Archiwa”, „Obrazy”, „Wideo”, „Audio” i „Dokumenty”. Dla tych podkategorii również zostaną opracowane zlokalizowane nazwy.

O czym nie powiedziano

vitis stał się bardzo wszechstronnym narzędziem, a trudno wszystko od razu objąć. Krótko wspomnę, co jeszcze można robić:

  • można usuwać kategorie i odłączać je od plików;
  • wyniki zapytań wyrażeniowych można kopiować do wskazanego katalogu;
  • plików można uruchamiać jako programy;
  • komenda show ma wiele opcji, na przykład sortowanie według nazwy/data zmiany lub dostępu/rozmiaru/rozszerzenia, wyświetlanie właściwości plików i ścieżek do oryginałów, włączenie wyświetlania ukrytych plików itd.;
  • przy zapisywaniu linków do internetowych źródeł można również zapisywać lokalne kopie stron HTML.

Wszystkie szczegóły można znaleźć w dokumentacji użytkownika.

Perspektywy

Często sceptycy mówią, że „nikt nie będzie samodzielnie ustawiać tych tagów”. Na swoim przykładzie mogę udowodnić odwrotne: już skategoryzowałem ponad sześć tysięcy plików, stworzyłem ponad tysiąc kategorii i pseudonimów, i było warto. Kiedy jednym poleceniem vitis open Plan otwierasz listę swoich zadań lub kiedy jednym poleceniem vitis open LaTeX otwierasz książkę Stolyarova o systemie składu LaTeX, to już psychicznie trudno korzystać z systemu plików „po staremu.”

Na tej podstawie pojawia się szereg pomysłów. Na przykład można stworzyć automatyczne radio, które odtwarza tematyczną muzykę zgodnie z aktualną pogodą, świętem, dniem tygodnia, porą dnia lub rokiem. Ciekawym rozwiązaniem byłby również odtwarzacz muzyczny, który rozpoznaje kategorie i może odtwarzać muzykę na podstawie wyrażeń operujących na kategoriach jak na zbiorach. Przydatne byłoby stworzenie demon, który będzie monitorował katalog „Pobrane” i proponował kategoryzację nowych plików. No i oczywiście warto byłoby stworzyć normalny, graficzny semantyczny menedżer plików. Kiedyś stworzyłem dla firmy usługę webową do współdzielenia plików, ale nie była ona priorytetowa i stała się nieaktualna, chociaż osiągnęła wysoki poziom funkcjonalności. (W związku z dużymi zmianami w samym vitis, stał się już nieprzydatny do użytku.)

tutaj mała demonstracja

Kategorie zamiast katalogów, czyli semantyczny system plików dla Linuksa

Podsumowanie

Vitis — nie jest to pierwsza próba radykalnej zmiany sposobu pracy z danymi, ale uznałem za ważne zrealizować swoje pomysły i opublikować realizację w otwartym dostępie na licencji GNU GPL. Dla wygody przygotowano pakiet deb dla architektury x86-64, powinien działać na wszystkich nowoczesnych dystrybucjach Debian. Na ARM napotkano drobne trudności (przy czym wszystkie inne programy związane z vitis, działają prawidłowo), ale w przyszłości pod tę platformę (armhf) również zostanie przygotowany działający pakiet. Z tworzeniem pakietów RPM na razie zaprzestałem z powodu problemów z Fedora 30 i trudności w rozszerzaniu na wiele dystrybucji RPM, ale później i tak dla kilku z nich zostaną stworzone pakiety. A na razie można korzystać z make && make install lub checkinstall.

Dziękuję wszystkim za uwagę! Mam nadzieję, że ten artykuł i ten projekt będą mogły okazać się przydatne.

Link do repozytorium projektu

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster