如何打开 thunar 以便它选择特定文件?

如何打开 thunar 以便它选择特定文件?

就像标题一样。在 Windows 上,我可以这样做:

explorer /select,"C:\folder\file.txt"

这将导致打开explorer.exe,将立即打开C:\folder并选择file.txt

我相信ROX也有这个功能。

我可以用 thunar 做同样的事情吗?

答案1

根据 的答案theY4Kman,这是不使用 Python 的方法:

dbus-send --type=method_call --dest=org.xfce.Thunar /org/xfce/FileManager org.xfce.FileManager.DisplayFolderAndSelect string:"/home/user/Downloads" string:"File.txt" string:"" string:""

唯一需要注意的是,您需要将文件夹路径和文件名分开。

答案2

经过一番挖掘,我发现使用 D-Bus 可以做到这一点:

#!/usr/bin/env python
import dbus
import os
import sys
import urlparse
import urllib


bus = dbus.SessionBus()
obj = bus.get_object('org.xfce.Thunar', '/org/xfce/FileManager')
iface = dbus.Interface(obj, 'org.xfce.FileManager')

_thunar_display_folder = iface.get_dbus_method('DisplayFolder')
_thunar_display_folder_and_select = iface.get_dbus_method('DisplayFolderAndSelect')


def display_folder(uri, display='', startup_id=''):
    _thunar_display_folder(uri, display, startup_id)


def display_folder_and_select(uri, filename, display='', startup_id=''):
    _thunar_display_folder_and_select(uri, filename, display, startup_id)


def path_to_url(path):
    return urlparse.urljoin('file:', urllib.pathname2url(path))


def url_to_path(url):
    return urlparse.urlparse(url).path


def main(args):
    path = args[1]  # May be a path (from cmdline) or a file:// URL (from OS)
    path = url_to_path(path)
    path = os.path.realpath(path)
    url = path_to_url(path)

    if os.path.isfile(path):
        dirname = os.path.dirname(url)
        filename = os.path.basename(url)
        display_folder_and_select(dirname, filename)
    else:
        display_folder(url)


if __name__ == '__main__':
    main(sys.argv)

执行:

$ ./thunar-open-file.py /home/user/myfile.txt

如果你通过的话,它仍然会打开一个文件夹:

$ ./thunar-open-file.py /home/user/

硬核证据的截屏视频

答案3

使用 thunar 的内置命令行开关,您就不能这样做。如果您看到man thunar,您会发现您只能以这种方式打开文件夹,但无法在其中预选文件。

是不是意味着你根本做不到?

幸运的是不是,但您需要外部程序的帮助。使用以下方法完成此操作的示例xdo工具发送ctrl+s并输入filename(这将有效地选择它):

#!/bin/sh
file=$1
[ -z "$file" ]; then
    echo 'No file selected' 1>&2
    exit 1
fi

if [[ ! $(command -v thunar) ]]; then
    echo 'Thunar is not installed' 1>&2
    exit 1
fi

if [ -d "$file" ]; then
    thunar "$file" &
else
    if [ ! -f "$file" ]; then
        echo 'File does not exist' 1>&2
        exit 1
    fi

    if [[ ! $(command -v xdotool) ]]; then
        echo 'Xdotool is not installed' 1>&2
        exit 1
    fi

    set -e #exit on any error
    thunar "$(dirname "$file")" &
    window_id=`xdotool search --sync --onlyvisible --class 'Thunar' | head -n1`
    xdotool key --clearmodifiers 'ctrl+s'
    xdotool type "$(basename "$file")"
    xdotool key Return
fi

用法:script /path/to/file-or-folder

有两个注意事项:

  1. 您会注意到由于 而导致的轻微滞后xdotool --sync,但我认为这是可以接受的。
  2. 这不适用于出于任何原因隐藏在 thunar 中的文件,例如点文件。

相关内容