Gnomeの最新ファイル機能に対応するCLI

Gnomeの最新ファイル機能に対応するCLI

Gnomeのファイルマネージャ(Nautilus)には、「仮想ディレクトリ」のように見える「最近のファイル」という機能があり、ユーザーのホームディレクトリから最新に作成/変更されたファイルを一覧表示します。

CLIでこれに相当するものを探しています。つまり、ナビゲーションは可能ですが、findコマンドの出力に基づいて動的結果を表示する仮想フォルダです。

電子メールを送信するにはemacsを使用し、各添付ファイルのパスを指定する必要があるため、別のフォルダから添付ファイルを送信するのは面倒です。最近作成/変更されたファイルがすべて含まれていることがわかっている仮想ディレクトリがある場合は、生活が良くなります。

あらかじめ作成されたツールがない場合は、ディレクトリfindから最新のファイルを検索し、findに出力されたファイルへの$HOMEシンボリックリンクを含む仮想フォルダを生成するコマンドを実行するスクリプトを作成し、それをcronとして実行するか、inotifyを使用します。

ただし、そのタスクを実行できるツールがすでにある場合は良いでしょう。

答え1

これにより、最近使用したファイルが表示されます~/.local/share/recently-used.xbel(またはむしろ${XDG_DATA_HOME}/recently-used.xbel)そしてそれをすべて次のディレクトリに接続します~/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', '\0')));" |
xargs -0 ln -st ~/recent

これは以下を使用します。XMLスター最近使用されたドキュメントのリストからファイルURIを抽出し(他のURIは無視します)、改行をNULL文字に置き換えるPythonスクリプトに供給し、エスケープされたURIを逆参照します(例えば +または%20、スペースの代わりに、最後にすべてのxargsファイル名を指定しln(GNUバリアント)に供給してシンボリックリンクを作成します。

リンクは、ターゲットファイルが存在するかどうかに関係なく生成されます。最近使用したファイルのリストには、削除された一時ファイルが含まれることがよくあります。

答え2

理想的には、CLIに対応する操作は次のように行われます。gvfs計画recent:///上記のように、位置をパラメータとして使用できます。ここ

nautilus recent:///

または1

gio open recent:///

サイドバーのボタンを使用しているかのように、最近使用したファイルが開きますnautilus。このスキームを理解するには、2つのCLIツールが必要であり、私が知っている唯一のツールは上記のツールだけなので、これはあなたの場合にはあまり役に立ちません。君は走れるよRecent
gvfsgio

gio list recent:///

gioただし、これらのパスの内部表現のみを取得できるため、出力は役に立ちません。それらが何に該当するかを確認するには、次のものを使用できます。

gio tree recent:///

ただし、多くの出力を解析/処理しない限り、これはほとんど使用できません。ただし、使用するツールを直接作成できます。GtkRecentManagerあなたが欲しいものをしてください。始めるには、以下は非常に基本的な例ですpython(エラーチェックなし、ターゲットディレクトリが存在し、空でなければなりません)。

#!/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)

たとえば、ディレクトリパスを引数として使用してmy_linker保存すると、PATH

my_linker /path/to/symlinks

そのディレクトリで最近使用したファイルへのシンボリックリンクを作成します。


1:gvfs-open廃止予定
2: 慣れていませんemacs。おそらく、これはすべてプラグインや拡張機能で実行できるかもしれません...しかし、わかりません...

答え3

おそらく完全には動作しませんが、起動は次のようになります。

#!/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" {} +

スクリプトは、ホームディレクトリに呼び出されたディレクトリを作成して使用しますrecent(すでに存在しないことを確認するか、スクリプトの名前を変更してください)。

まず、recent1日より古いシンボリックリンクディレクトリを消去します。

次に、過去24時間に変更されたホームディレクトリ内または下のすべての一般ファイルを検索し、それらの各ファイルのディレクトリにシンボリックリンクを作成しますrecent

複数のファイルが同じファイル名を持つ場合は、最初に見つかったファイルが優先されます。

スクリプトは、隠しファイルと隠しディレクトリのファイルも処理します。

検索からディレクトリを除外するには、たとえば、次のようにします。

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

これにより、隠しディレクトリと名前で始まるディレクトリが除外されます-mail

find最初のアイテムから移動または削除されたファイルのシンボリックリンクもクリーンアップするには、次のように変更します。

find "$recent_dir" -type l \( -ctime +1 -o ! -exec test -f {} \; \) -delete

関連情報