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
gvfs
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)
たとえば、ディレクトリパスを引数として使用して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
(すでに存在しないことを確認するか、スクリプトの名前を変更してください)。
まず、recent
1日より古いシンボリックリンクディレクトリを消去します。
次に、過去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