neděle 6. dubna 2014

GVFS metadata a pozice ikon na Ploše z příkazového řádku

Sice jsem se naučil ikony na ploše nepoužívat vůbec, protože prázdná plocha má být prázdná a uklidňující, případně informativní, ne stresující, plná bordelu, ale když jsem zahlédl požadavek na možnost nastavit rozmístění ikon na ploše Ubuntu z příkazového řádku, přišlo mi to zajímavé. Koukl jsem se kam Nautilus (který plochu v Ubuntu a GNOME spravuje) zapisuje po změně pozice ikony přetažením myší a ... zjistil prdlajs. Nautilus totiž využívá virtuální filesystém GVFS a tak se to stalo ještě zajímavější. Jistě, že to někde na ten disk nakonec zapíše také, ale stopuje se to hůř a nakonec jsou data v binární podobě. Zjistil jsem každopádně jak mohu číst i zapisovat metadata k jednotlivým souborům (i zcela nová, vlastní) přes gvfs-* příkazy a napsal dva skripty pro uložení a obnovení pozic ikon na ploše spravované Nautilem. Ale zrovna tak není problém obhospodařit Nema, či jiného správce plochy využívajícího GVFS. ...

GVFS umožňuje v uživatelském prostoru zpřístupnit data přes mnoho různých protokolů, jako je samba, ftp, ssh, ... a také spravuje metadata k jednotlivým souborům. Aplikace si tak mohou ke každému souboru ukládat vlastní atributy, jako je například pozice ikony na pracovní ploše. Zajímají-li vás všechna metadata ke konkrétnímu souboru, použijete následující příkaz:

gvfs-info soubor

Přepínačem -a můžete přímo specifikovat, jaký atribut vás zajímá, přičemž buď zadáte jen umístění (před dvojitou dvojtečkou), nebo přidáte i celé jméno konkrétního atributu.

$ gvfs-info -a access soubor
attributes:
  access::can-read: TRUE
  access::can-write: TRUE
  access::can-execute: FALSE
  access::can-delete: TRUE
  access::can-trash: TRUE
  access::can-rename: TRUE

Atributy můžete souborům přidávat a měnit i z příkazového řádku, kam můžete zapisovat, zjistíte příkazem:
$ gvfs-info --query-writable soubor
...
Writable attribute namespaces:
 metadata (string, Copy with file, Keep with file when moved)
 xattr (string, Copy with file, Keep with file when moved)
 xattr-sys (string, Keep with file when moved)

Takže si mohu k souboru zapsat vlastní poznámku (třeba hujaja) jako atribut metadata:
gvfs-set-attribute soubor metadata::muj-attribut hujaja

No a vlastní skripty pro zálohování a obnovení metadat Nautila s pozicí ikon na ploše může vypadat následovně. Cesta k Ploše se čte z nastavení prostředí, takže vždy bude použita ta aktuální.

get-positions
#!/bin/bash

DESKTOP_DIR=`xdg-user-dir DESKTOP`
ls -1 $DESKTOP_DIR | while read file; do
        echo "$file"
        gvfs-info -a 'metadata::nautilus-icon-position' "$DESKTOP_DIR/$file"|
                sed -n 's/.*: \(.*\)/\1/p' | tr -d "\n"
        echo
done


restore-positions
#!/bin/bash

SOURCE_FILE=$1
DESKTOP_DIR=`xdg-user-dir DESKTOP`
while read file; do
        read position
        [[ $position ]] || continue
                echo -e "Moving to $position \t$file" >&2
                gvfs-set-attribute "$DESKTOP_DIR/$file" metadata::nautilus-icon-position "$position"
done < $SOURCE_FILE


Použití je následující:
get-positions > soubor
restore-positions soubor

První skript vypíše všechny soubory z plochy spolu s jejich souřadnicemi na ploše, pokud je mají, do terminálu, přesměrováním se uloží do souboru. Druhý skript pak tento uložený výstup umí číst a souborům metadata s pozicí postupně obnovit.

GVFS si metadata ukládá na disku v binární podobě v adresáři
$HOME/.local/share/gvfs-metadata/

3 komentáře:

  1. Trochu mě pobavilo, když po 'tr -d "\n"' dáváš hned 'echo', což se nějak navzájem vyruší, ale možná to má nějaký skrytý význam ;) Taky si myslím, že údaje o poloze se na disk ukládají, protože musí přežít reboot, neukládají se ale okamžitě. Např. pozice na Desktopu mám v Mavericku uložené v '$HOME/.local/share/gvfs-metadata/home'.

    Jinak mě vždycky překvapí takovéto poloskryté a nepříliš zdokumentované utilitky, které Ubuntu obsahuje, a tak si myslím, že tímto děláš dobrou práci. Já používám 'gvfs-mount' pro výpisy připojených zařízení, hlavně těch, které nejsou v klasickém 'mount', a občas 'gvfs-trash' ve skriptech (lepší než nevratné 'rm').

    Jo, ještě bych měl jednu prosbu: jestli budeš mít čas a/nebo chuť, mrkni se na můj program: http://sourceforge.net/projects/h-f/. Jak jsem asi před měsícem psal, chtěl jsem upravit vyhledávání v hstr (bash history suggestion box), ale nakonec jsem to forknul a přepsal skoro celé po svém. Potřeboval bych nějaké nezávislé zhodnocení. Takže za případné připomínky budu vděčný! (Návod ještě napsaný nemám, ale zkompilovat bys to měl zvládnout, částečný návod je na začátku kódu.)

    Díky. arrange

    OdpovědětVymazat
    Odpovědi
    1. To vymazání znaku nového řádku má význam v tom, že pokud soubor nemá souřadnice, sed nic nevypíše a já potřebuju (dobře - chci) jednotnou strukturu, když to pak čtu. Vypisuju totiž schválně úplně všechny soubory, nejen ty, které souřadnice mají.

      Že to na disk nakonec ukládá je jasné, jen to tak jednoduše nevystopuju přes fatrace. Asi jsem tam měl napsat, že to vím, jen jsem byl zrovna líný dohledat ten konkrétní soubor :) Dohledám to a dopíšu.

      Na tvé dílo se určitě podívám a dám vědět.

      Díky za koment!

      Vymazat
    2. Super!
      Toto mi pomohlo vyřešit problém po konzolovém upgradu Ubuntu 15.04 -> 15.10, kdy mi nevyčítalo pozice ikon a ani nezapisovalo nové pozice. Sice jsem hledal root:root v ~, ale asi jsem přehlédl .local/share
      Problém byl, že adresář .local/share/gvfs-metadata/home byl pod vlastníkem root:root
      Díky! :-)

      Vymazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.