CLI equivalente ao recurso de arquivos recentes do Gnome

4

No Gerenciador de arquivos do Gnome (Nautilus), há um recurso chamado "Arquivos recentes" que se apresenta como um "diretório virtual" de tipos, listando os arquivos criados / modificados mais recentemente no diretório pessoal do usuário.

Estou procurando algo equivalente na CLI. isto é, uma pasta virtual que pode ser navegada para, mas que apresenta resultados dinâmicos baseados na saída de, digamos, o comando find.

Minha necessidade surge do fato de eu usar emacs para e-mail e é preciso especificar um caminho para cada anexo de arquivo, portanto, enviar anexos de arquivos de pastas diferentes é uma dor. A vida seria melhor se houvesse um único diretório virtual que eu sabia que teria todos os arquivos criados / modificados recentemente.

Se não houver uma ferramenta pronta para isso, eu escreveria um script para executar o comando find procurando os arquivos mais recentes no diretório $HOME e criar uma pasta virtual contendo links simbólicos para os arquivos saída por find; e execute isso como um cron ou use inotify.

No entanto, seria ótimo se já houvesse uma ferramenta para fazer esse trabalho.

    
por Vishal Belsare 22.09.2018 / 10:42

3 respostas

3

Idealmente, o equivalente CLI faria isso através de gvfs esquemas para poder usar o recent:/// location como um argumento, por exemplo como mencionado aqui

nautilus recent:///

ou 1

gio open recent:///

abriria os arquivos usados recentemente em nautilus , como se você tivesse usado o botão Recent da barra lateral.
Isso não ajuda muito no seu caso, já que você precisa de uma ferramenta CLI que entenda os esquemas gvfs eo único que eu conheço é o gio mencionado acima. Você poderia correr

gio list recent:///

mas a saída seria inútil, pois você obteria apenas representações internas de gio desses caminhos. Para ver o que eles correspondem a você poderia usar

gio tree recent:///

mas isso ainda não é utilizável a menos que você faça uma análise / processamento pesado da saída. No entanto, você pode criar sua própria ferramenta que use GtkRecentManager para fazer o que quiser. Para começar, aqui está um exemplo muito básico em python (nenhuma verificação de erro, o diretório de destino deve existir e estar vazio, etc.):

#!/usr/bin/env python

import gi,sys
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk,Gio
from sys import argv

tg_dir = argv[1]
rec_mgr = Gtk.RecentManager.get_default()
for item in rec_mgr.get_items():
    if item.exists():
        uri = item.get_uri()
        tg = Gio.File.new_for_uri(uri)
        tg_path = tg.get_path()
        b_name = tg.get_basename()
        dt_path = tg_dir + "/" + b_name
        dt = Gio.File.new_for_path(dt_path)
        dt.make_symbolic_link(tg_path, cancellable=None)

Se você salvar isso como, por exemplo, my_linker no seu PATH e execute-o com um caminho de diretório como um argumento

my_linker /path/to/symlinks

ele criará links simbólicos dos arquivos usados mais recentemente nesse diretório.

1: gvfs-open foi preterido
2: Eu não estou familiarizado com emacs - talvez tudo isso possa ser feito através de plugins ou extensões ... Eu não sei embora ...

    
por 24.09.2018 / 13:10
3

Isso fará com que os arquivos usados recentemente sejam mencionados em ~/.local/share/recently-used.xbel (ou melhor, ${XDG_DATA_HOME}/recently-used.xbel ), e ligá-los todos em um diretório chamado ~/recent :

#!/bin/sh
set -e
mkdir -p ~/recent
rm -f ~/recent/*       # Make sure you don’t have anything you care about here
xmlstarlet sel -t -m '/xbel/bookmark[starts-with(@href, "file://")]' \
    -v 'substring(@href, 8)' -n ${XDG_DATA_HOME:-~/.local/share}/recently-used.xbel |
python -c "import sys, urllib as ul;
sys.stdout.write(ul.unquote(sys.stdin.read().replace('\n', '
#!/bin/sh
set -e
mkdir -p ~/recent
rm -f ~/recent/*       # Make sure you don’t have anything you care about here
xmlstarlet sel -t -m '/xbel/bookmark[starts-with(@href, "file://")]' \
    -v 'substring(@href, 8)' -n ${XDG_DATA_HOME:-~/.local/share}/recently-used.xbel |
python -c "import sys, urllib as ul;
sys.stdout.write(ul.unquote(sys.stdin.read().replace('\n', '%pre%')));" |
xargs -0 ln -st ~/recent
')));" | xargs -0 ln -st ~/recent

Isso usa o XMLStarlet para extrair os URIs do arquivo da lista de documentos usados recentemente (ignorando outros URIs), alimentando-os em um Script Python que substitui newlines por nul characters e depois desquota os URIs com escape ( por exemplo + ou %20 em vez de espaço) e, finalmente, alimenta isso para xargs , que divide todos os nomes de arquivos e alimenta-os para ln (a variante GNU) para criar links simbólicos.

Observe que os links serão criados independentemente de o arquivo de destino ainda existir; muitas vezes acontece que a lista de arquivos usados recentemente inclui arquivos temporários que foram apagados desde então.

    
por 23.09.2018 / 22:20
1

Isso provavelmente não funcionaria perfeitamente, mas é um começo:

#!/bin/sh

recent_dir=$HOME/recent

mkdir -p "$recent_dir" || exit 1

find "$recent_dir" -type l -ctime +1 -delete

find "$HOME" -type f -mtime -1 -exec sh -c '
    dir=$1; shift
    for pathname do
        link=$dir/${pathname##*/}
        [ -h "$link" ] && continue
        ln -s "$pathname" "$link"
    done' sh "$recent_dir" {} +

Esse script criará e usará um diretório chamado recent em seu diretório pessoal (certifique-se de que esse diretório ainda não exista ou altere o nome no script).

Ele começa limpando os links simbólicos no diretório recent com mais de um dia.

Em seguida, ele localiza todos os arquivos regulares (apenas) dentro ou abaixo do diretório inicial que foram modificados no último período de 24 horas e, para cada arquivo, cria um link simbólico no diretório recent .

Se dois ou mais arquivos tiverem o mesmo nome de arquivo, o primeiro arquivo encontrado ganha.

O script também processaria arquivos e arquivos ocultos em diretórios ocultos.

Para excluir diretórios da pesquisa, use, por exemplo,

find "$HOME" -type d \( -name '.*' -o -name '*-mail' \) -prune \
    -o -type f -mtime -1 -exec sh -c ...as before...

Isso excluiria diretórios ocultos e qualquer diretório cujo nome terminasse com -mail .

Para que o primeiro find também limpe links simbólicos para arquivos que foram movidos ou excluídos, altere-o para

find "$recent_dir" -type l \( -ctime +1 -o ! -exec test -f {} \; \) -delete
    
por 22.09.2018 / 11:23