web-dev-qa-db-ja.com

Gnomeの最近のファイル機能に相当するCLI

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

CLIで同等のものを探しています。つまり、ナビゲートできるが、たとえばfindコマンドの出力に基づいて動的な結果を表示する仮想フォルダー。

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

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

ただし、この作業を行うためのツールがすでにあると便利です。

4
Vishal Belsare

理想的には、CLIと同等のものは、引数としてrecent:///の場所を使用できるように、 gvfsスキーム を介してそれを行います。前述のように ここ

nautilus recent:///

または1

gio open recent:///

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

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)

これを例として保存するとPATHmy_linkerを入れ、ディレクトリパスを引数として実行します

my_linker /path/to/symlinks

そのディレクトリに最近使用されたファイルのシンボリックリンクが作成されます。


1:gvfs-openは非推奨になりました
2:私はemacsに精通していません-多分このすべてはプラグインまたは拡張機能を介して行うことができます...私は知りませんが...

3
don_crissti

これにより、~/.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

これは XMLStarlet を使用して、最近使用されたドキュメントのリストからファイルURIを抽出し(他のURIを無視)、それらをPythonスクリプトにフィードします。次に、エスケープされたURI(eg+またはスペースの代わりに%20)の引用符を外し、最後にそれをxargsは、すべてのファイル名を分割してln(GNUバリアント)にフィードし、シンボリックリンクを作成します。

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

3
Stephen Kitt

これはおそらく完全には機能しないでしょうが、それは始まりです:

#!/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というディレクトリを作成して使用します(このディレクトリがまだ存在していないことを確認するか、スクリプトの名前を変更してください)。

それは、1日より古いrecentディレクトリ内のシンボリックリンクをクリアすることから始まります。

次に、過去24時間に変更されたホームディレクトリ内またはその下のすべての通常のファイル(のみ)を検索し、そのようなファイルごとにrecentディレクトリにシンボリックリンクを作成します。

2つ以上のファイルのファイル名が同じである場合、最初に見つかったファイルが優先されます。

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

ディレクトリを検索から除外するには、たとえば、.

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
1
Kusalananda