sobota 26. ledna 2013

Jak vytáhnout odpadky z koše, když Nautilus nestačí

Nedávno jsem  jednomu uživateli pomáhal se situací, kdy si v Shotwellu omylem smazal fotografie, které se tímto ocitly v koši, což je ta lepší zpráva, ale zároveň byla smazána adresářová struktura, ve které se fotografie nacházely, což je komplikací. Dříve jsem zaznamenal podobné případy i s Rhythmboxem. A když je těch souborů hodně a hlavně byly roztříděné v mnoha adresářích, je to radost. Nautilus sice umí soubory z koše obnovit, ale jen tehdy, pokud cílový adresář existuje. Pokud původní umístění nenajde, prostě se na to vy..prdne. Asi to má nějaký hlubší smysl, ale já osobně bych uživateli nabídl původní lokace v takovém případě obnovit. Bohužel to mohu nabídnout jen externě, ale pokud je nějaký zoufalec v této situaci, nic není ztraceno. Nautilus si totiž původní umístění pamatuje, jen ho neumí obnovit. ...

Základem pro obnovu dat jsou adresáře:

~/.local/share/Trash/files/

kde jsou smazané soubory fyzicky umístěny a

~/.local/share/Trash/info/

kde jsou ke každému souboru uloženy informace o původním umístění a čase přemístění do koše.

Pak už stačí jen vyrobit skript, který informace posbírá a obnoví soubory včetně jejich původních adresářů. Můžeme ho nazvat třeba ... prdel. Prostě jak chcete, jen ho určitě nenazývejte copy.py, to se vám vymstí, protože jedna z komponent programu se bude snažit importovat modul stejného jména, což povede k importu vašeho skriptu...

#!/usr/bin/python3

import os, shutil, urllib.parse

path_f = os.path.expanduser('~/.local/share/Trash/files/')
path_i = os.path.expanduser('~/.local/share/Trash/info/')

lst = []
files = os.listdir(path_f)
for file in files:
    if os.path.isdir(path_f + file): continue
    with open(path_i + file + '.trashinfo', 'r') as f:
        lines = f.readlines()
        dest = urllib.parse.unquote(lines[1].replace('Path=', ''))[:-1]
    lst.append([file, dest])
    print('\n', file,'\n-> ', dest)
i = input('\nZkopírovat tyto soubory? (a/n)  ')
if i.lower() == 'a':
    for i in lst:
        try:
            os.makedirs(os.path.dirname(i[1]))
        except OSError: pass
        shutil.copy2(path_f + i[0], i[1])
    print('\nSoubory byly zkopírovány.\n')
else:
    print('\nObnova souborů zrušena\n') 

Uvedený skript se spouští příkazem:
puthon3 /cesta/k/prdel
nebo jak jste si skript nazvali a nejprve vypíše soubory s jejich cílovými adresáři s dotazem na potvrzení kopírování a pak je překopíruje na původní umístění, přičemž vytvoří všechny potřebné adrsáře, pokud se nachází na připojených filesystémech.

Popravdě není to častá situace, ale praxe napovídá, že nastat může a pak není od věci mít připravené řešení. Zvlášť, když jsem ho připravil já. Howgh.





Žádné komentáře:

Okomentovat

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.