Jakie jest dobre rozwiązanie do tagowania plików w systemie Linux? [Zamknięte]

71

Szukałem sposobu na oznaczenie plików i wyszukiwanie / filtrowanie ich na podstawie tych tagów.

Oto moje ( zaktualizowane ) wymagania:

  • każdy plik czytelny dla użytkownika może być dowolnie oznaczony
  • użytkownik może wyszukiwać pliki pasujące do jednego lub kilku tagów
  • pliki można przenosić bez utraty wcześniej powiązanych tagów
  • można łatwo wykonać kopię zapasową systemu
  • brak zależności od dowolnego środowiska pulpitu
  • jeśli w grę wchodzi jakieś GUI, musi nastąpić awaria cli

Miałem nadzieję, że poradzi sobie z tym jakiś hackerski system plików i coreutils, ale jeszcze o tym nie myślałem.
Tymczasem przejrzę beagle i metatrackera, o których tu wspomniano, i zobaczę, jak się zachowują.


Ok, więc beagle ma ogromne zależności od gnome, a tracker jest w porządku, ale nadal ma pewne zależności, których nie lubię ...

Robiłem trochę więcej badań, a droga do rozwiązania mogłaby równie dobrze być rozszerzonymi atrybutami plików .
Jest to natywne rozwiązanie dla najnowszych systemów plików, ale nie są jeszcze bardzo dobrze obsługiwane (większość coreutils niszczy je domyślnie, na przykład cp potrzebuje flagi -a, aby je zachować). Chciałbym usłyszeć kilka przemyśleń na temat ich używania, podczas gdy ja sam próbuję swoich sił w hakowaniu, choć może to uzasadniać nowe pytanie.

Julien
źródło
2
Problemy z rozszerzonymi atrybutami plików: (i) Z mojego doświadczenia wynika, że ​​jest to uciążliwe, gdy chcesz wykonać kopię zapasową. (ii) Nie można ich używać podczas przechodzenia między systemami plików. Poza tym będą właściwą rzeczą.
Charles Stewart,
PytagsFS superuser.com/a/89140/129520
n611x007
Na forach PC-BSD w odniesieniu do edycji tego pytania z 2010 r .: PC-BSD, rozszerzone atrybuty i oznaczanie; Podejście OpenMeta i Apple
Graham Perrin
1
Nic dziwnego, że Reddit ma znacznie lepsze i nowsze odpowiedzi na to pytanie .
Dan Dascalescu,

Odpowiedzi:

13

Nie jest jasne, jakiego rodzaju poszukiwania chcesz. Jeśli chcesz, aby działał gdziekolwiek w Uniksie, a nie tylko w twoim katalogu domowym, a chcesz tylko wyszukiwać na podstawie ścieżek, poniższy schemat jest wykonalny, z odrobiną włamań do powłoki i przy użyciu standardowego locatedb:

  1. Każdy katalog, który zawiera co najmniej jeden oznakowany plik, potrzebuje standardowego podkatalogu, powiedzmy .path-tags;
  2. Każdy plik w katalogu $ FILE z linkiem $ TAG (który nie powinien zawierać znaku _) ma link$TAG_$FILE -> ../$FILE

Pozostawiam locate-tagtobie szczegóły skryptu; powinien być dwu- lub trzy-liniowy, używając tylko locatehakerskiego polecenia i powłoki. (Jeśli jesteś zainteresowany, mógłbym napisać jeden).

Niektórzy faceci KDE mówili o tego rodzaju schemacie metadanych, chociaż nie pamiętam szczegółów.

Powinno być również możliwe wykonanie bardziej wyrafinowanych, sprawdzających zawartość testów opartych na tym schemacie z podobnym skryptem find.

Myśli na temat zaktualizowanych wymagań

  1. każdy plik czytelny dla użytkownika może być dowolnie oznaczony - Tak, nie powinno być problemu
  2. użytkownik może wyszukiwać pliki pasujące do jednego lub kilku tagów - podobnie
  3. pliki można przenosić bez utraty uprzednio powiązanych tagów - katalogi, w których się znajdują, można swobodnie przenosić, ale jeśli plik zostanie przeniesiony z katalogu, mamy kłopoty. Jeśli tagi przyjęły formę $TAG_$INODE_$FILEi mamy skuteczny sposób na znalezienie ścieżek, które mają dany i-węzeł , możemy to zrobić, tracąc tagi tylko wtedy, gdy wyjdziemy z systemu plików. Kopiowanie plików może sprawiać problemy, a to jest znacznie bardziej skomplikowane niż moja pierwotna sugestia.
  4. kopię zapasową systemu można łatwo - nie jest to zasadniczo trudne.
  5. brak zależności od dowolnego środowiska pulpitu - brak
  6. jeśli w grę wchodzi jakieś GUI, musi nastąpić awaria cli - tam mieszkamy!

Postscript Plik „look-inode-lookup” opisany przez link (2), który pokazałeś mi w odpowiedzi na (1), może być wykorzystany do zapewnienia dodatkowej infrastruktury. Możemy uruchomić usługę na pliku wyszukiwania wstecznego, który sprawdza, czy każdy i-węzeł podany w nazwie pliku znacznika jest zgodny z i-węzłem pliku (jeśli istnieje), na który wskazuje znacznik. Jeśli nie ma dopasowania, można wykonać wymaganą operację (czy i-węzeł nadal istnieje? Gdzie to jest?), A plik wyszukiwania wstecznego jest mutowany lub regenerowany, a dowiązania symboliczne znaczników są aktualizowane.

Przewiduję jeden trudny przypadek: co się stanie, jeśli oznaczony plik nie znajduje się w miejscu, w którym znaczniki mówią, że powinien być, plik wyszukiwania wstecznego mówi, że nadal istnieje, ale plik marnotrawny nie znajduje się w miejscu, w którym znajduje się plik wyszukiwania, ponieważ plik wyszukiwania jest poza data? Istnieje kilka sposobów radzenia sobie z tą sprawą, żaden oczywiście nie jest idealny. Poza tym to całe zadanie wydaje się być czymś, co Perl doskonale nadaje się do ...

Charles Stewart
źródło
1
To miłe i myślałem też o użyciu dowiązań symbolicznych. Problem polega na tym, że pliku nie można przenosić bez utraty jego znaczników. Idealnie byłoby, gdyby tagi były niezależne od ścieżki, a wyszukiwanie tagu powinno zwrócić rzeczywisty plik, zamiast martwego dowiązania symbolicznego ... PS: Jestem za rozwiązaniem opartym na powłoce, ale myślę, że domena problemowa sprawia, że ​​It byłoby dość bolesne w utrzymywaniu tylko poprzez skrypty powłoki, mam nadzieję, że ktoś udowodni, że się mylę
Julien
Zredagowałem swoje pytanie, aby (mam nadzieję) wyjaśnić, jakiego rodzaju rozwiązania szukam. na zdrowie
Julien
Cholera, nigdy nie zdawałem sobie sprawy z tego, że iody, w których uporczywe prowadnice do plików, to jedzenie do przemyślenia!
Julien
1
i-węzły są identyfikatorami UID, ale są powiązane z danym FS, więc nie są przewodnikami. Nie jest to zła rzecz, ponieważ kopiowanie, kopie zapasowe, archiwizacja i c oznaczają, że pliki są duplikowane i przechowywane w innych plikach, a chcesz, aby stan fs zawierał wystarczającą ilość informacji, aby rozplątać wyniki.
Charles Stewart,
1
Brakowało mi punktu, jakie oprogramowanie może to obsłużyć? Miałem nadzieję, że będę mógł swobodnie korzystać bez pisania własnej infrastruktury. (Ale jasne, żebym mógł sam go
rozszerzyć,
22

Właśnie wypuściłem wersję alfa mojego nowego programu, który próbuje zapewnić tę funkcjonalność. Obecnie spełnia niektóre, ale nie wszystkie, Twoje wymagania. W każdym razie może Cię to zainteresować. Zapewnia narzędzie wiersza polecenia do oznaczania i wirtualny system plików do przeglądania (gdzie znaczniki są reprezentowane przez katalogi).

http://www.tmsu.org/

każdy plik czytelny dla użytkownika może być dowolnie oznaczony

Tak.

użytkownik może wyszukiwać pliki pasujące do jednego lub kilku tagów

Tak. Albo za pomocą narzędzia wiersza polecenia lub przeglądając katalogi znaczników w wirtualnym systemie plików.

pliki można przenosić bez utraty wcześniej powiązanych tagów

Nie. Jednak aplikacja przechowuje odciski palców oznaczonych plików, które pomagają zidentyfikować przeniesione pliki. Udostępniono polecenie „naprawy”, które zaktualizuje ścieżki przeniesionych plików. (Oczywiście ten mechanizm ulega awarii, jeśli plik zostanie przeniesiony i zmodyfikowany).

można łatwo wykonać kopię zapasową systemu

Tak. Jest to prosty plik bazy danych Sqlite 3.

brak zależności od dowolnego środowiska pulpitu

Tak. Bez zależności i ponieważ można go uruchomić jako wirtualny system plików, można go postrzegać jako system plików w dowolnym programie obsługującym łącza symboliczne.

jeśli w grę wchodzi jakieś GUI, musi nastąpić awaria cli

Obecnie brak GUI.

Paul Ruane
źródło
Wygląda bardzo interesująco. Czy masz pomysł, jak wdrożyć możliwość przenoszenia plików bez utraty powiązanych tagów?
student
@student: obecnie istnieje polecenie „naprawy”, które zajmuje się przeniesionymi i zmodyfikowanymi plikami. (Jeśli jednak przenosicie i zmodyfikujecie plik, nie zostanie to wykryte.)
Paul Ruane,
Może ktoś napisać warianty mv, cpa rmktóry obsługuje tagi, jak również (nazywamy je na przykład tmv, tcpa trm), wówczas nie stracą tagów przynajmniej jeśli ktoś korzysta z wiersza poleceń, aby przenieść pliki wokół ...
uczeń
@student TMSU obejmuje obecnie kilka skryptów, które wykonują operacje systemu plików utrzymując bazę danych na bieżąco: tmsu-fs-mv, tmsu-fs-rmi tmsu-fs-merge.
Paul Ruane
Przepraszam, ale… dlaczego nie po prostu klonuj tagów, gdy plik jest przenoszony automatycznie? Czy muszę ręcznie aktualizować pliki podczas przenoszenia?
erm3nda
6

Myślę, że to może spełnić wszystkie twoje wymagania. W każdym razie jest to fajny kawałek kodu:

http://pages.stern.nyu.edu/~marriaga/software/oyepa

GUI wymaga Qt, ale istnieje aplikacja wiersza poleceń do wyszukiwania, a fakt, że wszystkie tagi faktycznie znajdują się w nazwie pliku, sprawia, że ​​manipulowanie tagami | plikami z cli jest banalne.

Laramichaels
źródło
1
Ze strony: „Informacje o tagach są przechowywane w nazwie pliku” - więc jak wyglądają oznaczone nazwy plików? BTW, linki na tej stronie są bardzo interesujące: +1.
Charles Stewart,
report-for-bill [materiały, hr, wyprodukowane przeze mnie] .odt
laramichaels
@laramichaels Wiem, że to dość stare, ale podejście bardzo mnie zainteresowało. Gdyby nie brak dokumentacji (nigdzie nie wyjaśniono, jak działa nazywanie plików), przyjąłbym ją. Jeśli masz jakieś wiadomości na temat takich narzędzi, daj mi znać,
TomCho
6

Nikt nie wspominał, ale zdecydowanie powinieneś przyjrzeć się rozszerzonym atrybutom systemu plików. Na przykład ext4 je ma. istnieją narzędzia getfattr i setfattr, aby sobie z nimi poradzić. Oczywiście będziesz musiał napisać kilka skryptów powłoki, aby wyszukać pliki oznaczone czymś. Jeśli chodzi o wspomniane pytania, wszystkie odpowiedzi są „Tak”. Należy wziąć pod uwagę tylko, że zależy to od systemu plików.

alik
źródło
Dane i-węzłów pliku powinny być zdecydowanie poprawnym sposobem na wykonanie tego na ext4 fs, ale nie będą oferowały żadnej kompatybilności wstecznej. Dobrze?
erm3nda
6

Zaskoczony, że nikt nie wspomniał o TagSpaces . Spełnia wszystkie Twoje wymagania, ponieważ tagi są przechowywane w nazwie pliku, a TagSpaces jest wieloplatformowy.

TagSpaces

Dan Dascalescu
źródło
1
przestrzenie tagów nie mają rezerwowego interfejsu CLI, więc nie spełniają wszystkich wymagań. Czy może ma CLI? Jeśli tak, proszę daj mi znać!
TomCho,
Debian 9 apt nie obsługuje tej aplikacji. Coś się zbliża? - - Możesz zainstalować aplikację zgodnie z tymi instrukcjami tagspaces.org/products
Léo Léopold Hertz 준영
Czy możesz porównać swoją propozycję z narzędziami do wyszukiwania pulpitu w systemie Linux?
Léo Léopold Hertz -
5

Prawdopodobnie nie musisz instalować całego pulpitu KDE dla biblioteki tagów Nepomuk. Nadal będziesz musiał zainstalować biblioteki podstawowe KDE, jednak ...


źródło
1
tak, miałem nadzieję znaleźć alternatywę dla tego, ale to nie wygląda tak ...
Julien
2

Ten ostatni artykuł na temat Linux Desktop Search Tools wspomina, że Tracker obsługuje tagowanie. Niestety, w starej wersji, którą przetestowali, ma być w połowie złamana. Może teraz jest to naprawione?

  1. Nie w całym systemie.
  2. Możesz wykonać kopię zapasową.
  3. Jest dołączony do Gnome.
Iain
źródło
2

Wypróbuj Beagle . Uważam, że jest całkiem niezły.

Może nie spełniać wszystkich wymagań i nie jestem pewien, co mogłoby. Na przykład, czy pliki FIFO obsługują atrybuty rozszerzone? Jeśli nie, Beagle ma rezerwową bazę danych.

pcapademic
źródło
Czy beagle może obsługiwać nieregularne pliki?
Charles Stewart
@Charles Stewart - masz na myśli pliki nietekstowe?
pcapademic
Nie, mam na myśli pliki urządzeń, dowiązania symboliczne, FIFO i c
Charles Stewart
Ten link nie odnosi się do projektu dotyczącego organizacji dokumentów.
detly
1

Dlatego nie znajdziesz integracji Nepomuka w gnome, w wierszu poleceń lub w innym miejscu w systemie Linux.

I odwrotnie, dzięki Trackerowi nie znajdziesz AFAIK integracji kde. Nie jestem pewien w CLI.

Niestety odpowiedź wydaje się „nie”.

Co więcej, nie oznacza to również, że istnieje tutaj dobra okazja do jej zbudowania. Na przykład narzędzia wiersza poleceń systemu Linux nie mają wiele wspólnego z menedżerem plików GUI, więc pod względem architektonicznym nie ma wspólnego komponentu, który można by rozszerzyć w celu obsługi tej koncepcji.

pbr
źródło
0

Zrobiłem mały program, który używa SQLite do tego celu. To rozwiązało moją potrzebę, ale może ci też pomaga:

https://github.com/alvatar/dfym

Jedynym problemem związanym z tym podejściem jest to, że nie synchronizuje się z ruchami i usunięciami, ale rozwiązuje problem dla względnie statycznych plików.

alvatar
źródło
0

TMSU

TMSU to narzędzie do oznaczania plików. Zapewnia proste narzędzie wiersza polecenia do stosowania znaczników i wirtualny system plików, aby zapewnić oparty na znacznikach widok plików z dowolnego innego programu.

TMSU w żaden sposób nie zmienia twoich plików: pozostają one niezmienione na dysku lub w sieci, gdziekolwiek je umieścisz. TMSU utrzymuje własną bazę danych, a Ty po prostu zyskujesz dodatkowy widok, który możesz zamontować tam, gdzie chcesz, w oparciu o ustawione tagi.

Zaskoczony, nikt o tym nie wspominał.

justsomeguy
źródło
1
przegapiłeś to ... jest to najwyższa głosowana odpowiedź
pufferfish
-1

Proponuję rzucić okiem na system kontroli wersji, taki jak Subversion, dla tego rodzaju funkcji powyżej i poza systemem plików. Niektóre mogą być dla Ciebie lepsze niż inne, ale ogólnie:

  • Wiele obsługuje tagowanie (z pewnością subversion).
  • Wiele z nich jest wieloplatformowych; Windows, Mac, Linux, prawie wszystkie Uniksy.
  • Wiele z nich ma zarówno interfejsy GUI, jak i klientów wiersza poleceń.
  • Wiele już ma powiązania dla twojego ulubionego języka programowania / skryptów.
  • Wiele można łatwo wykonać kopię zapasową.
  • Wiele z nich zaprojektowano z myślą o łatwym udostępnianiu w taki czy inny sposób.
  • Wiele pozwala kontrolować dostęp.
  • Nie musisz ponownie wymyślać koła.
    • Uczysz się i używasz standardowych poleceń / narzędzi używanych już przez miliony.
  • Możesz zainstalować go dzisiaj dla swojego ulubionego repozytorium systemu operacyjnego; apt-get install, mniam zainstaluj
  • Otrzymujesz również zarządzanie wersjami „za darmo”.

Przykład cli z Subversion: ~/svn/atestrepository: $ svn propset mytag "something" dir1 property 'mytag' set on 'dir1' $ svn propset myothertag "nothing" dir1/file1 property 'myothertag' set on 'dir1/file1' $ svn propset anemptytag "" dir1/file2 property 'anemptytag' set on 'dir1/file2'

$ svn propget -R mytag dir1 - something ~/svn/atestrepository: $ svn propget -R myothertag dir1/file1 - nothing $ svn propget -R anemptytag dir1/file2 - $ svn proplist dir1/file2 Properties on 'dir1/file2': anemptytag svn:keywords

Nie poleciłbym, aby te narzędzia były regularnie zmieniane w dużych plikach binarnych (wielkości gigabajtów), ale dla wszystkich innych są już dobrze sprawdzone i skalowane do bardzo dużych rozmiarów.

Colin
źródło