Gnomeのファイルマネージャー(Nautilus)には、「最近のファイル」と呼ばれる機能があります。これは、ある種の「仮想ディレクトリ」のように表示され、ユーザーのホームディレクトリに最近作成/変更されたファイルを一覧表示します。
CLIで同等のものを探しています。つまり、ナビゲートできるが、たとえばfindコマンドの出力に基づいて動的な結果を表示する仮想フォルダー。
私の必要性は、私が電子メールにemacsを使用し、各添付ファイルへのパスを指定する必要があるという事実から生じます。したがって、異なるフォルダーから添付ファイルを送信するのは面倒です。最近作成/変更されたすべてのファイルが含まれることがわかっている単一の仮想ディレクトリがあれば、生活はより良くなります。
このための準備が整ったツールがない場合は、find
コマンドを実行して$HOME
ディレクトリ内の最新のファイルを検索するスクリプトを作成し、へのシンボリックリンクを含む仮想フォルダを作成します。 findによって出力されたファイル。それをcronとして実行するか、inotifyを使用します。
ただし、この作業を行うためのツールがすでにあると便利です。
理想的には、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)
これを例として保存するとPATH
にmy_linker
を入れ、ディレクトリパスを引数として実行します
my_linker /path/to/symlinks
そのディレクトリに最近使用されたファイルのシンボリックリンクが作成されます。
1:gvfs-open
は非推奨になりました
2:私はemacs
に精通していません-多分このすべてはプラグインまたは拡張機能を介して行うことができます...私は知りませんが...
これにより、~/.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バリアント)にフィードし、シンボリックリンクを作成します。
ターゲットファイルがまだ存在するかどうかに関係なく、リンクが作成されることに注意してください。最近使用したファイルのリストに、その後削除された一時ファイルが含まれていることがよくあります。
これはおそらく完全には機能しないでしょうが、それは始まりです:
#!/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