Gnome의 최신 파일 기능에 해당하는 CLI

Gnome의 최신 파일 기능에 해당하는 CLI

Gnome의 파일 관리자(Nautilus)에는 일종의 "가상 디렉터리"처럼 보이는 "최근 파일"이라는 기능이 있으며 사용자의 홈 디렉터리에서 가장 최근에 생성/수정된 파일을 나열합니다.

CLI에서 이에 상응하는 것을 찾고 있습니다. 즉, 탐색할 수 있지만 find 명령의 출력을 기반으로 동적 결과를 표시하는 가상 폴더입니다.

이메일을 보내기 위해 emacs를 사용하고 각 첨부 파일의 경로를 지정해야 하기 때문에 다른 폴더에서 첨부 파일을 보내는 것이 번거롭습니다. 최근 생성/수정된 파일이 모두 포함되어 있는 것으로 알고 있는 가상 디렉터리가 있다면 생활이 더 좋아질 것입니다.

미리 만들어진 도구가 없다면 find디렉터리에서 최신 파일을 검색 $HOME하고 find로 출력된 파일에 대한 심볼릭 링크가 포함된 가상 폴더를 생성하는 명령을 실행하는 스크립트를 작성하고 이를 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는 무시함) 줄 바꿈을 널 문자로 바꾸는 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(이미 존재하지 않는지 확인하거나 스크립트에서 이름을 변경하세요).

먼저 recent하루보다 오래된 심볼릭 링크 디렉터리를 지웁니다.

그런 다음 지난 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

관련 정보